PHP对接Google OAuth2时Google_Client::getRefreshToken()始终返回null如何解决
Google OAuth 刷新令牌返回null问题排查及解决
核心问题原因
- 第一:获取到令牌后没有将完整令牌(包含refresh_token)持久化存储到SESSION中,你当前代码仅将令牌设置到Google Client实例,未更新
$_SESSION['google_token'],页面刷新后原有refresh_token直接丢失。 - 第二:Google OAuth仅在用户首次授权时返回refresh_token,后续重复走授权流程、用户未主动触发授权操作时,接口不会再返回refresh_token字段。
- 第三:未显式设置强制授权参数,若用户之前已经授权过,后续授权流程会直接跳过授权步骤,不会返回refresh_token。
- 第四:确认
access_type参数确实为offline,只有离线访问权限才会发放refresh_token。
修复方案
1. 补充强制授权参数
初始化Client时增加approval_prompt参数设置,确保用户授权时返回refresh_token:
// 在get_google_client函数中,setAccessType之后添加以下代码 $client->setApprovalPrompt('force');
如果之前已经有用户授权过,需要让用户重新走一次授权流程,才能拿到新的refresh_token
2. 补充令牌持久化逻辑
每次更新令牌后,都要将完整令牌数据存回SESSION:
if ( $client->isAccessTokenExpired() ) { if ( $client->getRefreshToken() ) { $newToken = $client->fetchAccessTokenWithRefreshToken( $client->getRefreshToken() ); // 刷新令牌返回的新token不包含refresh_token,合并原有token的refresh_token if (!isset($newToken['refresh_token']) && isset($token['refresh_token'])) { $newToken['refresh_token'] = $token['refresh_token']; } $_SESSION['google_token'] = $newToken; $client->setAccessToken($newToken); } else { $auth_code = filter_input( INPUT_GET, 'code', FILTER_SANITIZE_STRING ); if ( $auth_code ) { $token = $client->fetchAccessTokenWithAuthCode( $auth_code ); // 首次授权拿到token后直接存到SESSION $_SESSION['google_token'] = $token; $client->setAccessToken( $token ); } else { // 无授权码且无refresh_token时跳转到授权页 header('Location: ' . $client->createAuthUrl()); exit; } } }
内容的提问来源于stack exchange,提问作者icolumbro
相关产品推荐
相关产品推荐

