我正在为我的Spring Boot微服务+ Angular2应用程序使用Azure AD OAuth 2.0授权流程 我的申请流程
redirect_uri
发送POST请求,此请求包含authorization_code
以及其他用户信息(如名字,姓氏和用户ID)。bearer
refresh_token
令牌和authorization_code
醇>
现在我想将bearer_token
发送给其他验证bearer_token
的微服务。
我的问题是如何验证bearer_token
并在其他微服务中检索该令牌的所有者?
答案 0 :(得分:2)
我假设您使用Azure AD OAuth 2.0的默认配置,该配置返回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;
}
}
此代码(经过小幅修改)取自Eugen Paraschiv(又名Baeldung)的优秀blog post。
您需要获取一个非对称公共加密密钥,Azure AD使用该密钥对签发的令牌进行签名,并从obtainAzureADPublicKey
方法返回。
基于documentation,您必须首先从https://login.microsoftonline.com/common/.well-known/openid-configuration
获取有关JWT签名密钥端点的元信息(通过从结果中检索"jwks_uri"
属性的值)。
然后您需要从该URL获取正确的密钥。
请注意,Azure AD会不时更改此信息,因此您无法在应用程序启动时执行此操作。但是,将其缓存至少24小时是个好主意。
答案 1 :(得分:1)
基本上,生成访问令牌的人应该负责验证它通常是授权服务器,我知道Azure是你的授权服务器,所以你应该在那里验证你的令牌
答案 2 :(得分:0)
对于您要发送到microservices
的任何HTTP请求,您应在标题中添加以下内容:
Authorization: Bearer bearer_token
bearer_token
是microservices
为该用户提供的令牌。
注意:我不知道microservice
在这里意味着什么,我假设它是一些Web API服务。