当前位置: 首页 > 知识库问答 >
问题:

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

钦永贞
2023-03-14

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

现在,在RESTendpointhtml" target="_blank">方法中,我有类似的东西

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

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

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

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

谢谢你的见解。

共有1个答案

漆雕育
2023-03-14

根据官方文档,要构建一个< 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"
}
 类似资料:
  • 我对Spring和Spring Security都是新手。我在读关于Spring Security的文章,它提出了principal的概念,应该是当前登录的用户。但如果我们有多个当前登录用户呢?那么,我的问题是,在Spring安全中,校长到底是什么? 例如,我已经阅读了本教程: http://www.mkyong.com/spring-security/get-current-logged-in-

  • 我们正在用spring security spring security oauth实现一个OAuth2资源服务器。 用例非常简单: A.某些资源仅适用于授权客户 对于Java配置,为了加强安全约束,我们使用了很多像这样的SpEL: 虽然这很好用,但我不喜欢: SpEL标记本身可能会变得棘手,直到运行时才能进行验证 一般来说,对于Spring Security,由安全配置基类(WebSecurit

  • 我是学习Spring的新手。我能找到的资源不多,无法解释当我们在Spring遇到安全API时会发生什么的事件顺序。 考虑以下场景: 我想让用户通过点击 /authenticateendpoint来登录。 在这种情况下,我可以看到涉及到几个不同的类: 1)WebSecurityConfigAdapter(允许我们指定安全性以及哪些角色可以访问特定endpoint) 2)OncePerRequest

  • 当我使用security.basic.enabled=false在具有以下依赖项的Spring Boot项目上禁用安全性时: 为了修复此异常,我必须添加属性-management.security.enabled=false。我的理解是,当执行器在类路径中时,应该将security.basic.enabled=false和management.security.enabled=false设置为禁用

  • 然后我添加了一个SecurityConfig。从那时起,CorsFilter停止工作,我在angular应用程序中得到了一个异常: CORS策略阻止了从origin“http://localhost:8080/users/999/folders/%2f/media/”从“http://localhost:4200”访问“http://localhost:8080/users/999/folders

  • 这是如此直接,所以如果我有我的值作为我的关键字,我可以做搜索和排序在一定程度上。但我唯一的问题是有一个警告说明不要使用KEYS命令。不确定Spring是否处理了,请提供您的想法。