Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wso2 在JWT授权中,我如何将JWT令牌中包含的授权声明与交换的访问令牌关联的作用域相关联?_Wso2_Wso2 Am - Fatal编程技术网

Wso2 在JWT授权中,我如何将JWT令牌中包含的授权声明与交换的访问令牌关联的作用域相关联?

Wso2 在JWT授权中,我如何将JWT令牌中包含的授权声明与交换的访问令牌关联的作用域相关联?,wso2,wso2-am,Wso2,Wso2 Am,这是我需要总结此集成的最后一部分: 我有一个生成JWT令牌的外部身份提供者。这些令牌包含包含用户权限的声明“auth”,例如:“auth”:[“editor”,“reviewer”] 在WSO2中,我有一个API,它在某些端点中需要“编辑器”作用域: 我使用JWT从外部IP交换WSO2访问令牌以调用API 我需要的是,当WSO2创建访问令牌时,它将其与JWT的“auth”声明中包含的范围相关联 这可能吗?是否有一个扩展点可以实现这一点?这应该可以通过扩展JWT grant类型和重写va

这是我需要总结此集成的最后一部分:

  • 我有一个生成JWT令牌的外部身份提供者。这些令牌包含包含用户权限的声明“auth”,例如:
    “auth”:[“editor”,“reviewer”]

  • 在WSO2中,我有一个API,它在某些端点中需要“编辑器”作用域

  • 我使用JWT从外部IP交换WSO2访问令牌以调用API
我需要的是,当WSO2创建访问令牌时,它将其与JWT的“auth”声明中包含的范围相关联


这可能吗?是否有一个扩展点可以实现这一点?

这应该可以通过扩展JWT grant类型和重写validateScope方法来实现。您可以从JWT检索范围并将其设置为tokReqMsgCtx。那个么你们应该能够像贝娄那个样调整示波器

@Override
public boolean validateScope(OAuthTokenReqMessageContext tokReqMsgCtx) {
    // Create scopes array
    // String scopes[] = getScopesFromJWT();
    tokReqMsgCtx.setScope(scopes);
    return true;
}
例如,看看SAML2承载授权类型[1]是如何做到这一点的

如果您使用的是JWT grant类型,它将在“repository/conf/identity/identity.xml”文件的SupportedGrantTypes部分中配置。配置中提到了相关的GrantTypeHandlerImplClass

<SupportedGrantType>
    <GrantTypeName>urn:ietf:params:oauth:grant-type:jwt-bearer</GrantTypeName
    <GrantTypeHandlerImplClass>org.wso2.carbon.identity.oauth2.grant.jwt.JWTBearerGrantHandler</GrantTypeHandlerImplClass>
    ....
</SupportedGrantType>


urn:ietf:params:oauth:grant-type:jwt-bearer这就是我最终通过扩展JWTBearerGrantHandler解决它的方法

public class JWTBearerGrantHandlerJWTAuthAware extends JWTBearerGrantHandler {

    private static final Log LOG = LogFactory.getLog(JWTBearerGrantHandlerJWTAuthAware.class);

    @Override
    public boolean validateScope(OAuthTokenReqMessageContext tokReqMsgCtx) throws IdentityOAuth2Exception {

        LOG.debug("validateScope()");
        try {
            final RequestParameter[] requestParameters = tokReqMsgCtx.getOauth2AccessTokenReqDTO().getRequestParameters();
            RequestParameter assertion = null;
            for (RequestParameter rp : requestParameters) {
                if (rp.getKey().equals("assertion")) {
                    assertion = rp;
                }
            }

            if (assertion != null) {
                final String jwtString = assertion.getValue()[0];
                try {
                    final JWT jwt = JWTParser.parse(jwtString);
                    final Object auth = jwt.getJWTClaimsSet().getClaim("auth");
                    if (auth != null) {
                        final JSONArray roles = (JSONArray) ((Map) auth).get("roles");
                        final String[] rolesArray = roles.toArray(new String[0]);
                        LOG.debug("validateScope() rolesArray " + rolesArray);
                        tokReqMsgCtx.setScope(rolesArray);
                    }
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    @Override
    public boolean issueRefreshToken() throws IdentityOAuth2Exception {
        return false;
    }
}
然后只需编辑
repository/conf/identity/identity.xml
以引用您的扩展授权处理程序:

        <SupportedGrantType>
            <GrantTypeName>urn:ietf:params:oauth:grant-type:jwt-bearer</GrantTypeName>
            <!--<GrantTypeHandlerImplClass>org.wso2.carbon.identity.oauth2.grant.jwt.JWTBearerGrantHandler</GrantTypeHandlerImplClass>-->
            <GrantTypeHandlerImplClass>xxx.JWTBearerGrantHandlerJWTAuthAware</GrantTypeHandlerImplClass>
            <GrantTypeValidatorImplClass>org.wso2.carbon.identity.oauth2.grant.jwt.JWTGrantValidator</GrantTypeValidatorImplClass>
        </SupportedGrantType>

urn:ietf:params:oauth:grant-type:jwt-bearer
xxx.jwtbearergrantandlerjwtauthAware
org.wso2.carbon.identity.oauth2.grant.jwt.JWTGrantValidator

感谢您回复Rans。您能指出我应该扩展哪个类以及如何注册以使用它吗?