提问者:小点点

使用Spring安全OAuth原则调用优酷API


我在玩谷歌YouTube API Java客户端库。我已经编写了一个Spring Boot服务,您可以使用Spring Security OAuth使用您的Google帐户登录。这一切都很好。

现在,在RESTendpoint方法中,我有类似的东西

@RequestMapping(value="/thing")
public ChannelListResponse getAThing( Principal principal )
{ ... }

其中主体实例是OAuth2AuthenticationToken的实例。

理想情况下,我希望我的服务使用登录用户的凭据进行YouTube API调用,但我无法弄清楚如何从给定的原则实例构建谷歌证书实例。

我知道我可以从我的应用编程接口密钥文件中创建一个服务帐户凭据,事实上我已经成功了,但是我很好奇是否可以使用OAuth2AuthenticationToken(我的主体)来代表该凭据进行调用。我实际上想在用户和谷歌之间打入一个楔子,能够增强/修饰额外的数据,理想情况下,所有这些都可以使用用户的凭据来完成。

谢谢你的见解。


共1个答案

匿名用户

根据官方文档,要构建一个< code>GoogleCredential实例,您必须拥有一个有效的访问令牌,并且必须像下面这样进行:

TokenResponse tokenResponse = new TokenResponse();
tokenResponse.setAccessToken(accessToken);

Credential credential = 
    createCredentialWithAccessTokenOnly(tokenResponse);

在哪里:

public static GoogleCredential
    createCredentialWithAccessTokenOnly(
        TokenResponse tokenResponse)
{
    return new GoogleCredential().
        setFromTokenResponse(tokenResponse);
}

根据SO上引用的教程,所需的访问令牌可从您的< code > oauth 2 authenticationtoken 实例获得,如下所示:

OAuth2AuthorizedClientService clientService;
OAuth2AuthenticationToken oauthToken;

OAuth2AuthorizedClient client =
    clientService.loadAuthorizedClient(
        oauthToken.getAuthorizedClientRegistrationId(),
        oauthToken.getName());

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

此外,您可以按照本文了解如何获取上面提到的OAuth2AuthorizedClientService的实例。

如果想脱离我上面提到的不推荐使用的GoogleCredential类,而使用类GoogleCrevential,那么事情似乎更简单:

public static GoogleCredentials
    createCredentialsWithAccessTokenOnly(
         OAuth2AccessToken oauthAccessToken)
{
    AccessToken accessToken = new AccessToken(
        oauthAccessToken.getTokenValue(),
        Date.from(oauthAccessToken.getExpiresAt()));
    return GoogleCredentials.create(accessToken);
}

(无需再使用令牌响应)。

对于将作用域附加到GoogleCredentials类的问题,我认为这是不必要的。

请注意,任何给定的有效访问令牌本身(已经!)都附加了一组作用域。该集是在 OAuth 流期间指定的。例如,您可以调用以下 URL(例如,在浏览器中,或在命令行提示符下发出 wgetcurl):

< code > https://www . Google APIs . com/oauth 2/v1/token info?访问令牌=访问令牌,

ACCESS_TOKEN替换为具体的访问令牌,以查看附加到相应令牌的作用域。

通过这样一个HTTPS GET方法调用获得的JSON响应看起来像这样:

{
  "issued_to": "...",
  "audience": "...",
  "scope": "...",
  "expires_in": 3599,
  "access_type": "offline"
}