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

使用PHP客户端使用Google API客户端刷新Token时出现“unauthorized_client”错误?

亢胤运
2023-03-14

我正在使用GoogleSignIn pod中的此代码从IOS应用程序请求访问用户数据

 [GIDSignIn sharedInstance].uiDelegate = self;
 [[GIDSignIn sharedInstance] setScopes:@[ ... ];
 [[GIDSignIn sharedInstance] signInSilently];

然后,我在应用代理中接收访问令牌和刷新令牌,并将其发送到运行PHP并使用此google客户端库(https://github.com/googleapis/google-api-php-client)的服务器...第一个小时一切正常,访问令牌有效,允许我访问所有范围。然后一个小时后,访问令牌过期,我尝试使用此代码刷新它

$client = new Google_Client();
$client->setApplicationName(<app name>);
$client->setDeveloperKey(<google_oauth_developer_key>);
$client->setClientSecret(<google_oauth_client_secret>);
$client->setClientId(<google_oauth_client_id>);
$client->refreshToken("1/12ju3ZZim-r6co195lIVNNvzBq9x5G64GJCWkYsOQ18");

并且上面的“刷新令牌”函数返回此错误

=> [
     "error" => "unauthorized_client",
     "error_description" => "Unauthorized",
   ]

值得注意的是,应用程序名称、google\u oauth\u developer\u密钥、google\u oauth\u client\u secret和google\u oauth\u client\u id没有更改。它们与之前在访问令牌尚未过期时检索用户联系人、日历事件等的操作相同。

什么可能导致此错误?

共有2个答案

史英飙
2023-03-14

好吧,我知道我做错了什么。我最初遵循这些指示https://developers.google.com/identity/sign-in/ios/sign-in假设您只需要在线访问,但实际上我需要离线访问作用域,所以我遵循以下说明https://developers.google.com/identity/sign-in/ios/offline-access现在就可以了。因此,不要让IOS应用程序像这样分别发送访问令牌和刷新令牌

- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {

    if (!error) {
        NSString *accessToken = user.authentication.accessToken;
        NSString *refreshToken = user.authentication.refreshToken;

我只是让它像这样发送服务器AuthCode

- (void)signIn:(GIDSignIn *)signIn didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {

      if (!error) {
        NSString *serverAuthCode = user.serverAuthCode;

然后在服务器上运行此代码以获取访问令牌

$access_token = $client->authenticate($google_server_auth_code);
$client->setAccessToken($access_token);

然后,当访问令牌过期时,我运行这个来刷新它

$access_token = $client->refreshToken($client->getRefreshToken());
$client->setAccessToken($access_token);
薛淮晨
2023-03-14

您需要在某个时候实际使用刷新令牌。

if ($client->isAccessTokenExpired()) {
        $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        $client->getAccessToken();

从我的Oauth2Authentication中删除的代码。php示例

笔记

还要记住,刷新令牌是基于用户/客户端的。因此,如果令牌是由一个客户端生成的,那么不同的客户端可能无法使用它。如果您可以在php应用程序中使用Ios代码中创建的刷新令牌,我会非常惊讶。客户端类型不同。

 类似资料:
  • 我刚开始使用Spring Reactor3(WebFlux),当试图使用WebClient使用RESTendpoint返回Flux时,我得到了以下错误。

  • Kafka作为消费者在本地主机中已经很好地工作了,但是,当我在远程机器中创建消费者时,我会遇到下一个错误: [2020-02-06 11:53:22,172]向主题TopicTest发送消息时出错key: null, value: 4 bytes with error:(org.apache.kafka.clients.producer.internals.ErrorLoggingCallback

  • 1. 创建 Maven 工程 服务端部署完毕后,我们可以新建一个 Maven 工程使用 SOFARegistry 提供的服务。首先新建一个 Maven 工程,然后引入如下依赖: <dependency> <groupId>com.alipay.sofa</groupId> <artifactId>registry-client-all</artifactId> <versi

  • 发起请求 让我们从导入aiohttp模块开始: import aiohttp 好啦,我们来尝试获取一个web页面。比如我们来获取下GitHub的时间轴。 async with aiohttp.ClientSession() as session: async with session.get('https://api.github.com/events') as resp:

  • 安装命令行工具 使用命令行工具 使用Python SDK 使用Web控制台

  • 介绍 回忆下第10部分中的客户端5.1版。客户端使用一个Deferred来管理所有的回调链,其中包括一个格式转换引擎的调用。在那个版本中,这个引擎的实现是同步的。 现在我们想实现一个新的客户端,使用我们在第十二部分实现的服务器提供的格式转换服务。但这里有一个问题需要说清楚:由于格式转换服务是通过网络获取的,因此我们需要使用异步I/O。这也就意味着我们获取格式转换服务的API必须是异步实现的。换句话