【问题标题】:How to validate access_token(Azure AD OAuth 2.0) in web API?如何在 Web API 中验证 access_token(Azure AD OAuth 2.0)?
【发布时间】:2018-01-17 11:31:58
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我假设您使用返回 JWT 编码令牌的 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 签名密钥

    您需要获取一个非对称公共加密密钥,Azure AD 使用它来签署已颁发的令牌并从obtainAzureADPublicKey 方法返回它。

    基于documentation,您必须首先从https://login.microsoftonline.com/common/.well-known/openid-configuration 获取有关JWT 签名密钥端点的元信息(通过从结果中检索"jwks_uri" 属性的值)。

    那么您需要从该 URL 获取正确的密钥。

    请注意,Azure AD 会不时更改此信息,因此您不能只在应用程序启动时更改一次。但是,将其缓存至少 24 小时是个好主意。

    【讨论】:

    • 嗨@Oleg,(从安全角度来看)可以在cookies中存储刷新令牌和不记名令牌吗?
    【解决方案2】:

    对于您发送到microservices 的任何 HTTP 请求,您应该在标头中添加以下内容:

       Authorization: Bearer bearer_token
    

    bearer_tokenmicroservices 为该用户提供的令牌。

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

    【讨论】:

    • 是的,我们可以说微服务是一种Web API。但我的问题是微服务/Web API 如何确定该令牌是否有效?此外,它应该能够检索与该令牌关联的用户信息以执行某些授权部分。
    • 验证令牌是否有效的责任在于microservice(或Web API Server)而不是你。如果它发送授权错误,则意味着您的bearer_token 已过期,需要使用refresh_token 刷新bearer_token。执行此操作的方法也作为 Web API 服务提供。通常他们还提供bearer_token 有效的秒数,尝试使用它。
    【解决方案3】:

    基本上,生成访问令牌的人应该负责验证它,通常是授权服务器,我知道 Azure 是您的授权服务器,所以您应该在那里验证您的令牌

    【讨论】:

    • 这就是我卡住的地方。如何从 Azure AD 验证它?
    猜你喜欢
    • 1970-01-01
    • 2021-07-29
    • 2019-05-13
    • 1970-01-01
    • 2019-06-02
    • 2021-06-01
    • 2014-06-17
    • 1970-01-01
    • 2021-03-21
    相关资源
    最近更新 更多