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

xen*_*ide 5 spring-security oauth-2.0 google-oauth spring-boot

上下文:我正在尝试使用 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
Run Code Online (Sandbox Code Playgroud)

所以我用 Spring Boot 2.1.6 设置了 google 登录,如下(它有效)

spring.security.oauth2.client.registration.google.client-id=...
spring.security.oauth2.client.registration.google.client-secret=...
spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8080/login/oauth2/code/google
spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token
spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth
spring.security.oauth2.client.provider.google.user-info-uri=https://openidconnect.googleapis.com/v1/userinfo
spring.security.oauth2.client.provider.google.jwk-set-uri=https://www.googleapis.com/oauth2/v3/certs
spring.security.oauth2.client.provider.google.issuer-uri=https://accounts.google.com
spring.security.oauth2.client.registration.google.scope=profile,https://www.googleapis.com/auth/youtube
Run Code Online (Sandbox Code Playgroud)

根据google google docs,我应该在 spring 发出请求期间取回访问/授权令牌。如何检索此令牌以便我可以进一步调用 API,例如 youtube?

xen*_*ide 5

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

不,它不会被消灭。您可以OAuth2AuthorizedClient通过OAuth2AuthorizedClientRepository或检索OAuth2AuthorizedClientService。在OAuth2AuthorizedClient包含OAuth2AccessToken和可选OAuth2RefreshToken。有关更多信息,请参阅参考文档

此外,更方便的获取方式OAuth2AuthorizedClient是通过@RegisteredOAuth2AuthorizedClient

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


Nat*_*Far 1

如果 Spring Security 配置为 OAuth 2.0 登录,则(默认情况下)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();
Run Code Online (Sandbox Code Playgroud)

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