WSO2 API管理器-jwt保护的端点公开

问题描述

有一个受保护的后端服务。为了访问需要提供用户名和密码,然后生成jwt令牌。用户名和密码可以根据用户动态变化。如何使用wso2 API公开此信息?

解决方法

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

,

我设法使用自定义授权类型来实现该解决方案。扩展了此“ 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;
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...