【问题标题】:Validation AZURE Access token in Resource Server验证资源服务器中的 AZURE 访问令牌
【发布时间】:2019-07-12 04:53:57
【问题描述】:

我有一个场景,我的所有资源服务器 API 都需要来自 Azure AD 的访问令牌,因为它需要调用 Graph API。据我所知,我们不能使用 Id Token 调用 Graph API,而是需要 Access Token。因此,在从 azure SSO 成功进行身份验证后,UI 在我的所有 Spring Boot 2 REST API 中将访问令牌作为不记名标头发送。

我的问题是如何根据我的 REST API 验证访问令牌。我们是否有任何开箱即用的功能来执行此操作,或者我们是否需要针对访问令牌实施自定义验证。

假设我是否有一个名为获取所有用户组的 REST API,如下所示

@PreAuthorize("hasRole('ROLE_ADMIN')")
public GroupDetailsResponse getAllUserGroups() {
 .....
}

如何使用访问令牌实现@PreAuthorize。

【问题讨论】:

    标签: rest azure spring-boot java-8 oauth-2.0


    【解决方案1】:

    验证令牌由一系列步骤组成,如果其中任何一个步骤失败,则必须拒绝请求。以下是您的 API 应执行的所有验证的列表:

    • 检查 JWT 格式是否正确

    • 检查签名

    • 验证标准声明

    • 检查应用程序权限(范围)

    要实现自定义验证,您需要执行以下操作:

    1. 解析 Jwt

    为了解析 JWT,您可以手动实施所有检查,如规范 RFC 7519 > 7.2 Validating a JWT 中所述,或使用 JWT.io 的令牌签名/验证库部分中列出的库之一。

    例如,如果您的 API 是使用 Node.js 实现的,并且您想使用 node-jsonwebtoken 库,那么您将调用 jwt.verify() 方法。如果解析失败,则库将返回 JsonWebTokenError 错误,并显示消息 jwt malformed。

    1. 检查签名算法

    API 需要检查 JWT 标头(属性 alg)指定的算法是否与 API 预期的算法相匹配。如果不是,则认为令牌无效,必须拒绝请求。

    要检查签名是否符合 API 的预期,您必须解码 JWT 并检索 JWT 标头的 alg 属性。

    或者,您可以使用JWT.io 的“用于令牌签名/验证的库”部分中列出的库之一。

    1. 验证声明

    一旦 API 验证了令牌的签名,下一步就是验证令牌负载的标准声明。需要进行以下验证:

    • 令牌到期:当前日期/时间必须早于 exp 声明中列出的到期日期/时间(这是一个 Unix 时间戳)。如果不是,则必须拒绝该请求。

    • 令牌发行者:iss 声明表示 JWT 的发行者。该值必须与您的 API 中配置的值匹配。对于 Auth0 发布的 JWT,iss 使用 https:// 前缀和 / 后缀保存您的 Auth0 域:https://YOUR_DOMAIN/。如果您使用的是自定义域功能,则该值将采用以下格式:https:///。

    • 令牌受众:aud 声明标识 JWT 的目标接收者。对于 Auth0 发布的 JWT,audholds 目标 API 的唯一标识符(API 设置中的字段标识符)。如果 API 不是 JWT 的目标受众,它必须拒绝请求。

    这里是用于 JAVA 的 JWT 库,您可以在其中使用 verify(token) 方法进行验证。

    https://github.com/auth0/java-jwt

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 2023-02-22
      • 2012-08-28
      • 2012-08-31
      • 2013-07-12
      • 2016-02-03
      • 2019-05-27
      相关资源
      最近更新 更多