资源服务器中的验证AZURE访问令牌

时间:2019-02-18 18:41:10

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

我有一个方案,我需要从Azure AD访问所有资源服务器API的令牌,因为它需要调用Graph API。据我所知,我们无法使用Id令牌调用Graph API,而是需要访问令牌。因此,从azure SSO成功进行身份验证之后,UI在我所有的Spring Boot 2 REST API中将访问令牌作为承载标头发送。

我的问题是如何针对我的REST API验证访问令牌。我们是否有任何可用的现成功能?还是需要对访问令牌实施自定义验证?

让我们说一下我是否有一个REST API,名为“获取所有用户组,如下所示”

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

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

1 个答案:

答案 0 :(得分:0)

验证令牌包括一系列步骤,如果其中任何一个失败,则必须拒绝该请求。以下列出了您的API应该执行的所有验证:

•检查JWT的格式是否正确

•检查签名

•验证标准声明

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

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

1)解析Jwt

要解析JWT,您可以按照规范RFC 7519 > 7.2验证JWT中的说明手动执行所有检查,也可以使用JWT的“令牌签名/验证库”部分中列出的库之一。 io。

例如,如果您的API是通过Node.js实现的,并且您想使用node-jsonwebtoken库,则可以调用jwt.verify()方法。如果解析失败,则库将返回JsonWebTokenError错误,消息jwt格式错误。

2)检查签名算法

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

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

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

3)验证索赔

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

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

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

•令牌受众:aud声明标识了JWT的目标收件人。对于由Auth0发出的JWT,音频将保留目标API的唯一标识符(API设置中的字段标识符)。如果该API不是JWT的目标受众,则必须拒绝该请求。

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

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