You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:54:00