如何在Web API中验证access_token(Azure AD OAuth 2.0)?

时间:2017-08-09 14:05:19

标签: spring-boot oauth oauth-2.0 azure-active-directory

我正在为我的Spring Boot微服务+ Angular2应用程序使用Azure AD OAuth 2.0授权流程 我的申请流程

  1. (从frond-end到我的Spring Boot应用程序的第一个请求)Spring启动应用程序重定向Azure登录页面。
  2. 用户输入他的凭据
  3. 授权服务器向redirect_uri发送POST请求,此请求包含authorization_code以及其他用户信息(如名字,姓氏和用户ID)。
  4. 然后我使用bearer
  5. 获得refresh_token令牌和authorization_code

    现在我想将bearer_token发送给其他验证bearer_token的微服务。

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

3 个答案:

答案 0 :(得分:2)

我假设您使用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;
    }
 }

此代码(经过小幅修改)取自Eugen Paraschiv(又名Baeldung)的优秀blog post

获取Azure签名密钥

您需要获取一个非对称公共加密密钥,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_tokenmicroservices为该用户提供的令牌。

注意:我不知道microservice在这里意味着什么,我假设它是一些Web API服务。