如何在 Spring 中使用 OAuth2 和 JWT 令牌代表特定用户调用受保护的资源?

Posted

技术标签:

【中文标题】如何在 Spring 中使用 OAuth2 和 JWT 令牌代表特定用户调用受保护的资源?【英文标题】:How to call a protected resource on behalf of a specific user using OAuth2 and JWT token in Spring? 【发布时间】:2017-12-16 05:21:30 【问题描述】:

所以我们有一个身份验证服务器,UI 应用程序在其中获取访问令牌,然后与 API 服务器通信,一切都很好。现在我们正在构建第三个应用程序,它需要 SSO 来验证同一个用户,这也很好。

但是,在某些情况下,第三个应用程序需要使用 API 服务器上的一些资源,据我了解,我们需要使用 client-id/secret 从身份验证服务器获取令牌,然后发送带有访问权限的请求令牌。这似乎也不错,但是我不确定 API 服务器将如何授权该令牌(对此的提示会很棒)。

但主要问题是我们希望代表用户发送此请求。这是因为 API 服务器需要审核所有用户的活动。 我们如何使用 Spring Boot/OAuth2 和 JWT Token 实现这一点?

我浏览了文档,我知道 @EnableOauth2Sso @EnableAuthorisationServer 等,但这种情况并不清楚,我什至不确定它是否在 Spring 中实现。

如果没有针对此场景的实现,您有什么建议?你有这方面的经验,可以分享一下吗?

【问题讨论】:

OAuth 中有 4 种授权类型/身份验证类型,您的场景(使用用户身份验证客户端)适合 Grant-type = Password。 (digitalocean.com/community/tutorials/an-introduction-to-oauth-2) 你可以使用 Spring Boot 的 OAuth 和 JWT 令牌来做到这一点。看看这个:websystique.com/spring-security/… 我想你想说你的第三个应用程序将代表用户 + 客户端与 oauth 身份验证服务器进行通信,如果是这样,那么肯定可以在 Spring OAuth 中轻松完成。跨度> 【参考方案1】:

您的 API 服务器扮演资源服务器的角色。为此目的设计了一个注释:@EnableResourceServer。然后,您的客户端应用程序将使用方便的 OAuth2RestTemplate 使用此资源。

有两种方法可以正确配置资源服务器并使其正常工作:

    在您的资源服务器应用程序中直接拥有公钥:这样当客户端应用程序尝试使用授权服务器提供的令牌从资源服务器获取资源时,这将验证令牌本身是否有效。 配置资源服务器以询问授权服务器给定的访问令牌是否有效,并根据响应允许或拒绝获取资源。

我使用第一种方法发布了sample app on github。在那里您可以看到授权服务器、客户端和资源服务器之间的交互,以及此实现所需的所有配置。希望对你有帮助。

【讨论】:

所以我们希望将公钥保存在身份验证服务器中,并且可以通过端点“/oauth/token_key”访问它。我一直在尝试查看 Spring 是否可以自动获取公钥并将其用于令牌验证但没有运气...... spring boot 中有没有这样的功能?无论如何,我最终手动自定义默认令牌转换器 JwtAccessTokenConverter 尝试使用资源服务器中的security.oauth2.resource.jwt.key-uri 属性

以上是关于如何在 Spring 中使用 OAuth2 和 JWT 令牌代表特定用户调用受保护的资源?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中使用 IPwhitelisting 和 OAuth2? [复制]

如何在 grails 和现有 oauth2 提供程序中使用 Spring Security 实现基于表单的登录

如何在 Spring Security 中动态指定 OAuth2 资源详细信息?

如何在 Spring 中使用 OAuth2 和 JWT 令牌代表特定用户调用受保护的资源?

Spring Security实现OAuth2.0授权服务 - 进阶版

如何使用 Oauth2 和 javascript 客户端(Spring Oauth2 + Angularjs)实现长期登录会话