簡體   English   中英

WSO2 API 管理器 - jwt 保護端點暴露

[英]WSO2 API manager - jwt protected endpoint exposing

有一個受保護的后端服務。 為了訪問需要提供用戶名和密碼,然后生成 jwt 令牌。 用戶名和密碼可以根據用戶動態。 這怎么可能使用 wso2 apim 來公開呢?

您可以通過編寫 class 調解器來實現此目的( https://apim.docs.wso2.com/en/next/mediation/learn/api-gateway-class-mediator-mediation/learn/api-gateway-class-mediator-mediation . 使用緩存實現 class 中介。 使用它,您可以讀取用戶名和密碼。 然后生成 JWT 令牌並針對用戶名存儲。 然后下一個請求,您可以從緩存中獲取令牌。

我已經設法使用自定義授權類型來實現解決方案。 擴展此“AbstractAuthorizationGrantHandler” class 並覆蓋 validateGrant 方法。 在允許授權的同時,我生成了后端 jwt 並將其傳遞給自定義響應 header。

 @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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM