获取资源服务器中的用户信息

Den*_*nov 5 java spring spring-security oauth-2.0 openid-connect

我已经配置了资源服务器,用于根据身份验证服务器验证 JWT 令牌。在下面的代码中,您可以看到我已定义的配置(是来自Auth0issuer-uri的 URI )。如果用户在我的公共客户端上针对 Auth0 进行身份验证,则该客户端会从 Auth0 接收 JWT 令牌。当我使用令牌标头调用资源服务器时,用户已获得授权,并且资源可用,但仅包含从 JWT 解析的基本数据,而不包含有关用户的完整信息。我有来自 Auth0 的可用端点,它提供用户名、图片、电子邮件等。SecurityContextHolderuserinfo

我的问题是,我是否可以在资源服务器中设置此用户信息端点,以自动获取此信息,或者最好的方法是什么?我希望将此信息包含在SecurityContextHolder或至少包含用户的电子邮件和用户名中。

@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
    http.authorizeRequests().anyRequest().permitAll()
        .and()
        .oauth2ResourceServer().jwt();
    return http.build()
}
Run Code Online (Sandbox Code Playgroud)

和 JWT 解码器 bean

@Bean
fun jwtDecoder(): JwtDecoder? {
    val jwtDecoder = JwtDecoders.fromOidcIssuerLocation<JwtDecoder>(issuer) as NimbusJwtDecoder
    val audienceValidator: OAuth2TokenValidator<Jwt> = AudienceValidator(audience)
    val withIssuer = JwtValidators.createDefaultWithIssuer(issuer)
    val withAudience: OAuth2TokenValidator<Jwt> = DelegatingOAuth2TokenValidator(withIssuer, audienceValidator)
    jwtDecoder.setJwtValidator(withAudience)
    return jwtDecoder
}
Run Code Online (Sandbox Code Playgroud)

文件application.properties

spring.security.oauth2.resourceserver.jwt.issuer-uri=my-domain.com
spring.security.oauth2.resourceserver.jwt.audience=my-audience
Run Code Online (Sandbox Code Playgroud)

编辑这是从 Auth0 收到的 JWT 的有效负载

{
  "iss": "https://dev-abcdefgh.us.auth0.com/",
  "sub": "google-oauth2|353335637216442227159",
  "aud": [
    "my-audience",
    "https://dev-3ag8q43b.us.auth0.com/userinfo"
  ],
  "iat": 1663100248,
  "exp": 1663186648,
  "azp": "m01yBdKdQd5erBxriQde24ogfsdAsYvD",
  "scope": "openid profile email"
}
Run Code Online (Sandbox Code Playgroud)

小智 1

我希望在 SecurityContextHolder 中或至少在用户的电子邮件和用户名中包含此信息。

你看到你的 jwt 令牌里面有什么吗?您是否在身份验证过程中添加了 openid 范围?如果是这样,您的身份验证服务器响应 json 正文中应该有一个 IdToken,在 IdToken jwt 令牌声明中,有有关用户数据的各种信息,例如用户名和电子邮件。还可以通过向 jwt 令牌添加自定义声明来添加其他用户属性,添加这些声明后,您可以尝试通过 SecurityContextHolder 访问它。

参考链接