В гранте JWT как я могу связать утверждения авторизации, содержащиеся в токене JWT, с областями, связанными с обмененным токеном доступа? - PullRequest
0 голосов
/ 21 декабря 2018

Это последний фрагмент, который мне нужен для обобщения этой интеграции:

  • У меня есть внешний провайдер идентификации , который генерирует токены JWT.Эти токены содержат утверждение «auth», которое включает в себя права пользователя, например: "auth" : [ "editor", "reviewer"].

  • В WSO2 у меня есть API, который требует области действия «редактор» в некоторых своих конечных точках:

  • Я использую JWT Grant для обмена JWT с внешнего IP на токен доступа WSO2 для вызова API.

Мне нужно, чтобы при создании токена доступа WSO2 он связывал его с областями, содержащимися в утверждении «auth» изJWT.

Возможно ли это?Есть ли точка расширения, где это может быть реализовано?

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Вот как я наконец-то решил эту проблему, расширив 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>
0 голосов
/ 22 декабря 2018

Это должно быть возможно путем расширения типа предоставления JWT и переопределения метода validateScope.Вы можете извлечь области из JWT и установить для него tokReqMsgCtx.Тогда вы сможете установить Scopes, как показано ниже.

@Override
public boolean validateScope(OAuthTokenReqMessageContext tokReqMsgCtx) {
    // Create scopes array
    // String scopes[] = getScopesFromJWT();
    tokReqMsgCtx.setScope(scopes);
    return true;
}

Например, посмотрите, как это делается для типа предоставления носителя SAML2 [1].

Если вы используете тип предоставления JWT, он настраивается в разделе SupportedGrantTypes файла "repository / conf / identity / identity.xml".Связанный GrantTypeHandlerImplClass упоминается в конфигурации.

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

См. Документ [2] по написанию настраиваемого типа предоставления.

[1] https://github.com/wso2/carbon-apimgt/blob/6.x/components/apimgt/org.wso2.carbon.apimgt.keymgt/src/main/java/org/wso2/carbon/apimgt/keymgt/handlers/ExtendedSAML2BearerGrantHandler.java

[2]https://docs.wso2.com/display/IS560/Writing+a+Custom+OAuth+2.0+Grant+Type

...