Oauth2:请求访问令牌的自定义声明

kg7wmglp  于 2023-04-29  发布在  其他
关注(0)|答案(1)|浏览(247)

是否可以在请求时将自定义声明添加到访问令牌中?
我的意思是,默认情况下,授权服务器会添加其声明,但在mu的情况下,我想请求一个访问令牌,请求额外的自定义声明。
这可能吗?
我尝试使用nimbusds库:
下面是我的代码:

/**
    * Obtains an OAuth2 access token using the client credentials grant.
    *
    * @param clientId the client ID to authenticate with the token endpoint
    * @param clientSecret the client secret to authenticate with the token endpoint
    * @return the access token value as a string
    */
public String getToken(String clientId, String clientSecret) throws URISyntaxException, ParseException, IOException {
    // Construct the client credentials grant
    AuthorizationGrant clientGrant = new ClientCredentialsGrant();

    // The credentials to authenticate the client at the token endpoint
    ClientID clientID = new ClientID(clientId);
    Secret clientSECRET= new Secret(clientSecret);
    ClientAuthentication clientAuth = new ClientSecretBasic(clientID, clientSECRET);

    // The request scope for the token (may be optional)
    // Scope scope = new Scope("core");

    // The token endpoint
    URI tokenEndpoint = new URI("http://localhost:5444/oauth2/token");
    // URI tokenEndpoint = new URI("http://localhost:8081/realms/master/protocol/openid-connect/token");

    // Make the token request
    TokenRequest request = new TokenRequest(tokenEndpoint, clientAuth, clientGrant, null, null, Map.of("custom", List.of("custom")));

    TokenResponse response = TokenResponse.parse(request.toHTTPRequest().send());

    if (! response.indicatesSuccess()) {
        // We got an error response...
        TokenErrorResponse errorResponse = response.toErrorResponse();
        log.info("errorResponse: {}", errorResponse.toString());
    }

    AccessTokenResponse successResponse = response.toSuccessResponse();

    // Get the access token
    AccessToken accessToken = successResponse.getTokens().getAccessToken();
    log.info("accessToken: {}", accessToken.toJSONString());

    return accessToken.getValue();

}

正如你所看到的,我正在尝试在这一行代码中添加自定义值:

TokenRequest request = new TokenRequest(tokenEndpoint, clientAuth, clientGrant, null, null, Map.of("custom", List.of("custom")));

但收到的令牌没有请求自定义声明。
有什么想法吗

axr492tv

axr492tv1#

OAuth标准不允许您直接在授权消息中请求自定义声明,因为这样做可能会产生重大的安全问题。
自定义声明的发布必须在授权服务器中预先配置,沿着提供检索声明的运行时值的方法。这是以管理员批准的方式完成的。然后在令牌发行时使用以下方法之一,其中第一种方法可以提供对域特定声明的发行的最佳控制。

  • 从授权服务器调用API
  • 从授权服务器调用数据库

API请求将传入身份属性,例如subjectemail,并接收回域特定属性,例如rolessubscription_level。然后将返回的值发给令牌。
下一步应该是在您的授权服务器文档中查找这样的功能。并非所有人都支持这种行为。

相关问题