我假设您使用Azure AD OAuth 2.0的默认配置来返回JWT编码的标记。这种类型的令牌几乎没有什么好处 - 您可以从令牌中自行提取信息,例如授予的范围,并且您可以通过检查令牌签名来避免向验证服务器发送验证请求。
配置JWT令牌验证
您将需要配置资源服务器(你的Web API)使用JWT令牌:
@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer config) {
config.tokenServices(tokenServices());
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setVerifierKey(obtainAzureADPublicKey());
return converter;
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
return defaultTokenServices;
}
}
此代码(带小的修改),从优秀blog post取Eugen Paraschiv(aka Baeldung)。
获取Azure的签名密钥
您将需要得到一个非对称的公共加密密钥在Azure AD使用签署发布的令牌,并从obtainAzureADPublicKey
方法返回。
基础上documentation你将不得不(通过检索"jwks_uri"
财产从结果值)首先获得来自https://login.microsoftonline.com/common/.well-known/openid-configuration
智威汤逊的签名密钥端点的元信息。
然后,您需要从该URL获取正确的密钥。
请注意,Azure AD会不时更改此信息,因此您无法在应用程序启动时只执行一次。但是,将其缓存至少24小时将是一个好主意。
Hi @ Oleg,它是否(从安全的角度来看)可以在Cookie中存储刷新令牌和不记名令牌? –