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

b1zrtrql  于 2022-09-18  发布在  Spring
关注(0)|答案(1)|浏览(144)

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

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

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

和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
}

文件application.properties

spring.security.oauth2.resourceserver.jwt.issuer-uri=my-domain.com
spring.security.oauth2.resourceserver.jwt.audience=my-audience

编辑这是从授权0接收的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"
}
kninwzqo

kninwzqo1#

我希望有这些信息在SecurityConextHolder或至少用户的电子邮件和用户名。

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

Reference link

相关问题