使用Google_Client获取Refresh Token失败:返回结果无Refresh Token
解决Google Client获取Refresh Token为Null的问题
我来帮你排查这个拿不到Refresh Token的问题,结合你使用的google/apiclient: ^2.2版本,主要有这几个核心关键点需要注意:
1. 重复授权导致无新Refresh Token
Google OAuth2的机制里,如果用户之前已经给你的应用授予过相同范围的权限,哪怕你设置了approval_prompt=force,有时候也不会返回新的Refresh Token。这时候你需要让用户手动撤销应用权限:
- 打开Google账号的安全设置,找到你的应用
- 点击撤销授权,然后重新走一遍授权流程,这时候就能拿到Refresh Token了
2. 冗余参数清理与正确配置
你代码里的setState('offline')是完全多余的,state参数是用来防范CSRF攻击的,和离线授权半毛钱关系都没有。正确的离线授权只需要保留这两个设置:
$client->setAccessType("offline"); $client->setApprovalPrompt('force');
(注:在后续新版本的客户端里可能会用setPrompt('consent')替换setApprovalPrompt,但你用的2.2版本用force是没问题的)
另外setIncludeGrantedScopes(true)是用于增量授权的,和Refresh Token无关,如果你的场景不需要增量授权,可以去掉这个设置。
3. 确认authenticate参数的正确性
你传入的<auth_token_goes_here>必须是授权码(authorization code),而不是access token或者id token!很多人在这里踩坑,传错了参数类型肯定拿不到Refresh Token。要确保这个值是从OAuth2授权流程的回调页面里获取的code参数。
4. 检查Google Cloud控制台配置
- 确认你的OAuth2客户端ID类型和应用匹配(Web应用/桌面应用等)
- 回调地址必须和控制台里配置的完全一致,哪怕多一个斜杠都不行
- 如果是未验证的外部应用,要确保在OAuth consent screen里添加了测试用户,否则普通用户可能无法正常授权
修正后的示例代码
$config = [ 'client_id' => '你的客户端ID', 'client_secret' => '你的客户端密钥', 'redirect_uri' => '你的回调地址', ]; $client = new \Google_Client($config); $client->setAccessType("offline"); $client->setApprovalPrompt('force'); // 别忘了添加你需要的权限范围,比如Drive只读 $client->addScope(\Google_Service_Drive::DRIVE_READONLY); // $authCode是从授权回调中获取的code参数 $token = $client->authenticate($authCode); var_dump($token); // 现在应该能看到refresh_token字段了
内容的提问来源于stack exchange,提问作者Anand Siddharth
相关产品推荐
相关产品推荐

