【问题标题】:Getting a new token with Google OAuth refresh token returns invalid grant error使用 Google OAuth 刷新令牌获取新令牌返回无效授权错误
【发布时间】:2020-09-14 07:46:07
【问题描述】:

我正在请求使用以下 PHP 代码块访问用户的 Google 课堂数据:

public function getGoogleClassroomToken(){
  
  if($this->user==null){
    return ["result"=>"error","message"=>"You need to log in to do that!"];
  }

  if ($this->user['gc_token']) {
    return ["result"=>"error","message"=>"User already has access token!"];
  }

  $client = new Google_Client();
  $client->setApplicationName('example.com');
  $client->setAuthConfig('/var/www/client_secret.json');
  $client->setAccessType('offline');
  $client->setPrompt('select_account consent');
  $client->addScope(Google_Service_Classroom::CLASSROOM_COURSEWORK_STUDENTS);
  $client->addScope(Google_Service_Classroom::CLASSROOM_COURSES_READONLY);
  $client->addScope(Google_Service_Classroom::CLASSROOM_ROSTERS_READONLY);

  $redirect_uri = 'https://example.com/gc.php';
  $client->setRedirectUri($redirect_uri);
  $authUrl = $client->createAuthUrl();
  return ["result"=>"success","authUrl"=>$authUrl];

}

..这似乎工作正常。然后我使用以下代码块实例化 Google 客户端:

public function getGoogleClassroomClient(){
  if($this->user==null){return false;}
  if (!$this->user['gc_token']) {return false;}
  $client = new Google_Client();
  $client->setAuthConfig('/var/www/client_secret.json');
  $client->setAccessToken((array)json_decode($this->user['gc_token']));
  
  if ($client->isAccessTokenExpired()) {
    if ($client->getRefreshToken()) {
        $token = $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
        var_dump($token);
    }
  }
  
  return $client;
}

.. 除非令牌已过期,否则工作正常,在这种情况下 $token 变量输出:

array(2) { ["error"]=> string(13) "invalid_grant" ["error_description"]=> string(11) "Bad Request" }

有人知道这里出了什么问题吗?

【问题讨论】:

  • 检查刷新令牌不为空。然后检查您运行它的机器上的日期和时间是否与 NTP 同步
  • 您能否确认刷新令牌不为空,就像@DaImTo 提到的那样?
  • 我可以确认刷新令牌不为空

标签: oauth refresh-token google-classroom


【解决方案1】:

回答

根据the Google APIs Client Library for PHP,如果不抛出this exception,您的刷新令牌不能为空刷新令牌必须作为setAccessToken 的一部分传入或设置,这是有道理的,因为您正在调用$client->getRefreshToken()并返回 2 个选项:the refresh token or null

如果您查看Google Identity Platform: Using OAuth 2.0 to Access Google APIs > Refresh token expiration,您的刷新令牌似乎已过期,有一些可能的情况:

  • 用户已撤消您应用的访问权限。
  • 刷新令牌已有六个月未使用。
  • 用户更改了密码,刷新令牌包含 Gmail 范围。
  • 用户帐户已超过授予(实时)刷新令牌的最大数量。
  • 如果客户端不是服务帐户,则客户端已达到每个帐户 50 个刷新令牌的限制。

参考

Google API Client for PHP

Google Identity Platform: Using OAuth 2.0 to Access Google APIs

【讨论】:

    猜你喜欢
    • 2015-10-11
    • 2021-11-01
    • 2016-10-13
    • 2021-11-21
    • 2015-02-24
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多