【问题标题】:WSO2 API manager - jwt protected endpoint exposingWSO2 API 管理器 - 受 jwt 保护的端点暴露
【发布时间】:2020-08-14 06:19:15
【问题描述】:

有一个受保护的后端服务。为了访问需要提供用户名和密码然后生成jwt token。用户名和密码可以根据用户动态。这怎么可能使用 wso2 apim 公开呢?

【问题讨论】:

    标签: jwt wso2 wso2-am wso2is


    【解决方案1】:

    您可以通过编写一个类中介(https://apim.docs.wso2.com/en/next/learn/api-gateway/message-mediation/adding-a-class-mediator/)来实现这一点。使用缓存实现类中介。使用它,您可以读取用户名和密码。然后生成 JWT 令牌并根据用户名存储。然后下一个请求你可以从缓存中获取令牌。

    【讨论】:

    • 在这种情况下,我是否必须在每个 api 调用中传递用户名、密码?
    • 是的,您可以在请求标头中传递它。
    • 感谢 chashika。我会试试这个,让你知道。一个问题,在集群环境中使用 chace 会不会出问题?
    • 我觉得不会有问题
    【解决方案2】:

    我已经设法使用自定义授权类型来实施解决方案。扩展了这个“AbstractAuthorizationGrantHandler”类并覆盖了 validateGrant 方法。在允许授权的同时,我生成了后端 jwt 并将其传递给自定义响应标头。

     @Override
    public boolean validateGrant(OAuthTokenReqMessageContext oAuthTokenReqMessageContext)  throws IdentityOAuth2Exception {
    
        log.debug("Custom jwt Grant handler is hit");
    
        // extract request parameters
        RequestParameter[] parameters = oAuthTokenReqMessageContext.getOauth2AccessTokenReqDTO().getRequestParameters();
    
        String username = null;
        String password = null;
        String email = null;
    
        for(RequestParameter parameter : parameters){
            if(CUSTOM_JWT_GRANT_PARAM_USERNAME.equals(parameter.getKey())){
                if(parameter.getValue() != null && parameter.getValue().length > 0){
                    username = parameter.getValue()[0];
                }
            }
            else if(CUSTOM_JWT_GRANT_PARAM_PASWORD.equals(parameter.getKey())){
                if(parameter.getValue() != null && parameter.getValue().length > 0){
                    password = parameter.getValue()[0];
                }
            }
            else if(CUSTOM_JWT_GRANT_PARAM_EMAIL.equals(parameter.getKey())){
                if(parameter.getValue() != null && parameter.getValue().length > 0){
                    email = parameter.getValue()[0];
                }
            }
        }
    
        if(username != null) {
            //validate backend username/password
            ResponseHeader responseHeader = new ResponseHeader();
            String token = generateBackendToken(username, password, email);
            if(token !=null) {
                log.debug("backend token generation success");
                // if valid set authorized username as grant user
                AuthenticatedUser jwtUser = new AuthenticatedUser();
                jwtUser.setUserName(username);
                responseHeader.setKey(CUSTOM_HEADER_BACKEND_TOKEN);
                responseHeader.setValue(token);
                oAuthTokenReqMessageContext.setAuthorizedUser(jwtUser);
                oAuthTokenReqMessageContext.setScope(oAuthTokenReqMessageContext.getOauth2AccessTokenReqDTO().getScope());
                oAuthTokenReqMessageContext.addProperty(RESPONSE_HEADERS, new ResponseHeader[]{responseHeader});
            } else{
                log.debug("backend token generation failed");
                responseHeader.setKey(CUSTOM_HEADER_BACKEND_TOKEN);
                responseHeader.setValue(CUSTOM_HEADER_BACKEND_TOKEN_INVALID);
                oAuthTokenReqMessageContext.addProperty(RESPONSE_HEADERS, new ResponseHeader[]{responseHeader});
            }
    
        }
    
        return true;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2020-10-02
      • 2023-03-20
      • 2020-04-07
      • 1970-01-01
      相关资源
      最近更新 更多