带有预取 JWT 令牌的 OAuth2RestTemplate

Posted

技术标签:

【中文标题】带有预取 JWT 令牌的 OAuth2RestTemplate【英文标题】:OAuth2RestTemplate with prefetched JWT token 【发布时间】:2017-01-14 22:16:00 【问题描述】:

从 Spring Auth Server 预取 JWT OAuth2 Token 并存储在 Redis Storage 中。

我不想在OAuth2RestTemplate 中请求访问令牌,我想使用我的 JWT 令牌进行请求。

我可以使用OAuth2RestTemplate 还是我应该使用通常的RestTemplate

【问题讨论】:

请在这个问题中添加一些细节。 JWT 是一个语义 OAuth2 令牌,因此授权标头的格式为 Authorization: Bearer <JWT with Oauth2 payload>,或者 JWT 是否意味着要检查访问令牌作为不同授权方案的一部分,然后将其转换或...? JWT 是授权标头中的 OAuth2 令牌 【参考方案1】:

spring-security-oauth 的文档在这里很有用,基本上是两个部分:JWT 令牌和访问受保护的资源:

JWT 令牌

要使用 JWT 令牌,您需要在授权中使用 JwtTokenStore 服务器。资源服务器还需要能够解码令牌 所以 JwtTokenStore 依赖于 JwtAccessTokenConverter, 并且授权服务器都需要相同的实现 和资源服务器。默认情况下对令牌进行签名,并且 资源服务器也必须能够验证签名,所以它 要么需要与授权相同的对称(签名)密钥 服务器(共享密钥,或对称密钥),或者它需要公钥 (验证者密钥)与私钥(签名密钥)匹配 授权服务器(公私或非对称密钥)。公众 密钥(如果可用)由授权服务器在 /oauth/token_key 端点,默认情况下使用访问规则是安全的 “拒绝所有()”。您可以通过注入标准 SpEL 来打开它 表达式到 AuthorizationServerSecurityConfigurer(例如 "permitAll()" 可能就足够了,因为它是一个公钥)。

要使用 JwtTokenStore,您需要在您的 类路径(您可以在与 Spring 相同的 github 存储库中找到它 OAuth,但发布周期不同)。

访问受保护的资源

提供资源的所有配置后,您可以 现在访问这些资源。访问这些的建议方法 资源是使用 Spring 3 中引入的 RestTemplate。OAuth 对于 Spring Security 提供了 RestTemplate 的扩展, 只需要提供一个实例 OAuth2ProtectedResourceDetails。

这对我来说基本上意味着您将在授权服务器和资源服务器中使用相同的 spring-security-jwt JwtAccessTokenConverter 类,并且每个中的令牌服务都需要使用 JwtTokenStore() 设置。他们所指的 RestTemplate 类的扩展是来自 spring-security-oauth2 的 OAuth2RestTemplate。您可以在资源服务器中使用它,它的 JWT 智能由等效的令牌识别器提供。

因为 spring-security-oauth2 代码已经设置为处理 JWT 令牌,您只需要提供一些关键部分,让框架完成检查令牌并将安全性置于每个受保护范围内的繁重工作资源。

正如它所发生的那样,有人发布了一个很好的例子,详细说明:baeldung spring-security-oauth-jwt example 和这里:github project of the same 包括如何提供更定制的 JWT(声明/有效负载)。

【讨论】:

以上是关于带有预取 JWT 令牌的 OAuth2RestTemplate的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 中从服务器获取带有 jwt 令牌的响应标头

使用带有 RSA 的 JWT 解码 Id 令牌

带有 API 密钥和 JWT 令牌的 Net Core API

带有 JWT 令牌的 Spring Security 和 Websocket

CORS 错误和带有 JWT 令牌的 403 响应

Flask jwt POST 数据到带有令牌的端点