如何使用代码授权流在 Spring 应用程序中提取 Oauth2 访问令牌?

Posted

技术标签:

【中文标题】如何使用代码授权流在 Spring 应用程序中提取 Oauth2 访问令牌?【英文标题】:How do I extract the Oauth2 access token in a Spring application using code grant flow? 【发布时间】:2021-08-22 19:01:18 【问题描述】:

我已关注this guide.

我有一个使用代码授予授权流程的简单 Oauth2 webapp。我有一个 @GetMapping 端点(根据教程),它返回从我正在使用的服务提供商检索到的用户信息。由于这将我的信息正确地返回到 webapp,我可以告诉代码授权流程已经工作。工作端点代码:

@GetMapping("/user")
public Map<String, Object> user(@AuthenticationPrincipal OAuth2User principal) 
    return principal.getAttributes();

现在我想创建一个新的@GetMapping,在其中使用访问令牌来查询刚刚授权我们的服务提供者的 API。

问题在于,上面的示例以某种方式神奇地仅根据配置向我发出请求,并且只返回用户信息。现在我想获取 Spring 存储在某处以访问 API 但我喜欢“手动”的会话的访问令牌。

如何在我的新 @GetMapping 中提取访问令牌?

我搜索了很多,但我对 Oauth2 和 Spring 都是新手,而且春季课程和教程太多,以至于我“看不到森林,因为所有的树”。

我感谢任何帮助。 干杯。

【问题讨论】:

【参考方案1】:

我解决了。

添加以下内容:

@Autowired
private OAuth2AuthorizedClientService authorizedClientService;

private String getSessionBearerToken() 
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
    OAuth2AuthorizedClient client =
            authorizedClientService.loadAuthorizedClient(
                    oauthToken.getAuthorizedClientRegistrationId(),
                    oauthToken.getName());
    return client.getAccessToken().getTokenValue();

当你调用它时,这个方法会得到你的访问令牌。

【讨论】:

以上是关于如何使用代码授权流在 Spring 应用程序中提取 Oauth2 访问令牌?的主要内容,如果未能解决你的问题,请参考以下文章

配置授权服务器端点

如何在@Controller 中提取身份验证令牌

配置授权服务器端点

如何使用 Spring Boot 和 Angular 应用程序隐藏授权标头

如何使用 Spring Security 处理基于用户权限的授权?

如何在 Spring OAuth SSO 授权服务器中处理令牌过期?