WSO2 API 管理器 - jwt 保护端点暴露
WSO2 API manager - jwt protected endpoint exposing
有一个受保护的后端服务。为了访问需要提供用户名和密码,然后生成 jwt 令牌。用户名和密码可以根据用户动态变化。这怎么可能使用 wso2 apim 公开它?
您可以通过编写 class 中介程序 (https://apim.docs.wso2.com/en/next/learn/api-gateway/message-mediation/adding-a-class-mediator/) 来实现此目的。使用缓存实现 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;
}
有一个受保护的后端服务。为了访问需要提供用户名和密码,然后生成 jwt 令牌。用户名和密码可以根据用户动态变化。这怎么可能使用 wso2 apim 公开它?
您可以通过编写 class 中介程序 (https://apim.docs.wso2.com/en/next/learn/api-gateway/message-mediation/adding-a-class-mediator/) 来实现此目的。使用缓存实现 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;
}