我已经配置了资源服务器,它根据身份验证服务器验证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"
}
1条答案
按热度按时间kninwzqo1#
我希望有这些信息在SecurityConextHolder或至少用户的电子邮件和用户名。
你看到你的JWT令牌里面有什么了吗?您是否在身份验证过程中添加了OpenID作用域?如果是这样的话,在您的身份验证服务器响应json主体中应该有一个IdToken,在IdToken JWT令牌声明中有关于用户数据的各种信息,比如用户名和电子邮件。还可以通过向您的JWT令牌添加自定义声明来添加其他用户属性,在添加这些声明后,您可以尝试通过SecurityConextHolder访问它。
Reference link