我可以从Spring Security Oauth检索访问令牌吗?

时间:2019-07-02 01:41:37

标签: spring-boot spring-security oauth-2.0 google-oauth

上下文:我正在尝试使用Google播放列表,现在就列出它们

 https://localhost:6523/api/OData/Entity/?  
 expand=CustomAttributes($select=id,customattributetypeId,value,entityid)
 ,Type($select=id,type,subtype)
 &$filter=TypeId  eq 74 
                    and CustomAttributes/any(d: d/Value in 
                         ('ACFI','f6fe7a7e')) 
                    and BIType/Id eq 74 

所以我已经用Spring Boot 2.1.6设置了Google登录名,如下所示(有效)

curl \
  'https://www.googleapis.com/youtube/v3/playlists?part=snippet%2CcontentDetails&maxResults=25&mine=true&key=[YOUR_API_KEY]' \
  --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  --header 'Accept: application/json' \
  --compressed

根据google google docs,我应该在spring提出请求的过程中取回访问/授权令牌。如何获取此令牌,以便可以进一步调用API(例如youtube)?

2 个答案:

答案 0 :(得分:5)

来自@jgrandja https://github.com/spring-projects/spring-security/issues/7088#issuecomment-511820737

不,它不会消失。您可以通过OAuth2AuthorizedClientOAuth2AuthorizedClientRepository检索OAuth2AuthorizedClientServiceOAuth2AuthorizedClient包含OAuth2AccessToken和可选的OAuth2RefreshToken。 有关更多信息,请参见ref doc

另外,通过@RegisteredOAuth2AuthorizedClient是获取OAuth2AuthorizedClient的更便捷方法。

我建议您阅读参考文档,因为那里有很多信息可能会回答您的问题。

答案 1 :(得分:-1)

如果为OAuth 2.0登录名配置了Spring Security,则OAuth2LoginAuthenticationFilter使用HttpSessionOAuth2AuthorizedClientRepository(默认情况下)将经过身份验证的用户存储在会话中。尽管不幸的是Authentication对象(OAuth2AuthenticationToken)没有原始令牌,但是您应该能够从已保存在会话中的客户端中提取它:

String attributeName = HttpSessionOAuth2AuthorizedClientRepository.class.getName()
                           +  ".AUTHORIZED_CLIENTS";

Map<String, OAuth2AuthorizedClient> authorizedClients = request.getSession()
                                                      .getAttribute(attributeName);

OAuth2AuthorizedClient client = authorizedClients.get("google");

String token = client.getAccessToken().getTokenValue();

尽管这应该起作用,但它非常脆弱。希望有另一种解决方案,不涉及将自定义实现交换到安全框架中。