2017-08-09 91 views
1

我为我的Spring Boot Microservices + Angular2应用程序使用Azure AD OAuth 2.0授权流程。我的应用程序如何在web API中验证access_token(Azure AD OAuth 2.0)?

  1. (从头端来我的春节,启动应用程序第一次请求)春启动应用程序
    流量重定向它Azure的登录页面。
  2. 用户输入他的凭据
  3. 授权服务器发送POST请求redirect_uri,这一要求有authorization_code与其他用户的信息(如姓,名和用户ID)一起。
  4. 然后我用authorization_code

现在我想送bearer_token到其他微服务,这将验证bearer_token得到bearer令牌和refresh_token

我的问题是如何验证bearer_token并在其他微服务中检索该令牌的所有者?

回答

1

我假设您使用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小时将是一个好主意。

+0

Hi @ Oleg,它是否(从安全的角度来看)可以在Cookie中存储刷新令牌和不记名令牌? –

1

基本上谁生成的访问令牌应负责验证它通常是授权服务器的人,我理解Azure是你的授权服务器所以,你应该验证令牌

+0

那就是我卡住的地方。我如何从Azure AD验证它? –

0

对于任何HTTP请求你发送到microservices,您应该添加以下的标题:

Authorization: Bearer bearer_token 

bearer_token是由microservices为用户提供的令牌。

注意:我不知道microservice是什么意思,我假设这是一些Web API服务。

+0

是的,我们可以说微服务是一种Web API。但我的问题是microservice/Web API将如何确定该令牌是否有效?此外,它应该能够检索与该令牌关联的用户信息以执行某个授权部分。 –

+0

验证令牌是否有效的责任在于微服务(或Web API服务器),但不是你。如果它发送授权错误,这意味着您的'bearer_token'已过期,并且有时间使用'refresh_token'刷新'bearer_token'。通过它可以做到这一点的方法也作为Web API服务提供。通常他们还提供'bearer_token'有效的秒数,尝试使用它。 – ViKiG

相关问题