oauth - 使用 Google OAuth 刷新令牌获取新令牌返回无效授权错误
问题描述
我请求使用以下 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" }
有谁知道这里可能出了什么问题?
解决方案
回答
根据适用于 PHP 的 Google API 客户端库,如果不抛出此异常 ,刷新令牌不能为 null必须传入或设置为 setAccessToken 的一部分,这很有意义,因为您正在调用$client->getRefreshToken()
并返回 2 个选项:刷新令牌或空。
如果您查看Google 身份平台:使用 OAuth 2.0 访问 Google API > 刷新令牌过期,您的刷新令牌似乎已过期,有一些可能的情况:
- 用户已撤消您应用的访问权限。
- 刷新令牌已六个月未使用。
- 用户更改了密码,并且刷新令牌包含 Gmail 范围。
- 用户帐户已超过授予(实时)刷新令牌的最大数量。
- 如果客户端不是服务帐户,则客户端已达到每个帐户 50 个刷新令牌的限制。
参考
推荐阅读
- javascript - 如何在 HTML 和 CSS 中制作 14x5 的单选按钮网格
- reactjs - FirebaseError:安装:缺少应用配置值:“projectId”(安装/缺少应用配置值)
- python - 需要按特定顺序从列表中获取索引
- scala - Scala 2 将方法附加到类主体(元编程)
- python - 部署到heroku后无法在Django中加载照片
- python - 我试图创建一个密码,但它两次更改同一个字母
- android - Splashscreen API 未显示图标
- dynamics-nav - Microsoft Navision /Dynamics 导航数据库
- validation - 如何在 go-ozzo/ozzo-validation 中使用 Min() 或 Max() 规则验证结构字段的长度
- java - 如何在 JAVA 中使用 MongoDB 聚合组操作方法