Php 如何使用存储的刷新令牌获取更新的访问令牌

Php 如何使用存储的刷新令牌获取更新的访问令牌,php,oauth-2.0,google-analytics-api,google-api-php-client,Php,Oauth 2.0,Google Analytics Api,Google Api Php Client,我正在构建一个应用程序,允许管理员验证对其分析帐户的离线使用权限,并将刷新令牌存储在数据库中 if($_googleClient->isAccessTokenExpired()) { // Don't think this is required for Analytics API V3 //$_googleClient->refreshToken($_analytics->dbRefreshToken($_agencyId)); echo 'Acces

我正在构建一个应用程序,允许管理员验证对其分析帐户的离线使用权限,并将刷新令牌存储在数据库中

if($_googleClient->isAccessTokenExpired()) {
    // Don't think this is required for Analytics API V3
    //$_googleClient->refreshToken($_analytics->dbRefreshToken($_agencyId));
    echo 'Access Token Expired'; // Debug

    $_googleClient->authenticate();
    $NewAccessToken = json_decode($_googleClient->getAccessToken());
    $_googleClient->refreshToken($NewAccessToken->refresh_token);
}
现在,当我尝试在前端使用API时,它返回以下错误:

"Access Token Expired. There wan a general error : The OAuth 2.0 access token has expired, and a refresh token is not available. Refresh tokens are not returned for responses that were auto-approved."
以下是迄今为止生成此错误的代码:

require_once "lib/google/Google_Client.php";
require_once "lib/google/contrib/Google_AnalyticsService.php";

$_analytics = new analytics();
$_googleClient = new Google_Client();
$_googleClient->setClientId($_analytics->gaClientId);
$_googleClient->setClientSecret($_analytics->gaClientSecret);
$_googleClient->setRedirectUri($_analytics->gaRedirectUri);
$_googleClient->setScopes($_analytics->gaScope);
$_googleClient->setAccessType($_analytics->gaAccessType);

// Returns last access token from the database (this works)
$_tokenArray['access_token'] = $_analytics->dbAccessToken($_agencyId);
$_googleClient->setAccessToken(json_encode($_tokenArray));

if($_googleClient->isAccessTokenExpired()) {
    // Don't think this is required for Analytics API V3
    //$_googleClient->refreshToken($_analytics->dbRefreshToken($_agencyId));
    echo 'Access Token Expired'; // Debug
}

if (!$_googleClient->getAccessToken()) {
    echo '<h2>Error - Admin has not setup analytics correct yet</h2>';
}
require_once“lib/google/google_Client.php”;
require_once“lib/google/contrib/google_AnalyticsService.php”;
$\u analytics=新分析();
$\u googleClient=新的Google\u客户端();
$\u googleClient->setClientId($\u analytics->gaClientId);
$\u googleClient->setClientSecret($\u analytics->gaClientSecret);
$\u googleClient->setRedirectUri($\u analytics->gaRedirectUri);
$\u谷歌客户端->设置镜($\u分析->煤气镜);
$\u googleClient->setAccessType($\u analytics->gaAccessType);
//从数据库中返回最后一个访问令牌(此操作有效)
$\u tokenArray['access\u token']=$\u analytics->dbAccessToken($\u agencyId);
$\u googleClient->setAccessToken(json_编码($\u tokenArray));
如果($\u googleClient->isAccessTokenExpired()){
//不要认为这是分析API V3所必需的
//$\谷歌客户端->刷新令牌($\分析->数据库刷新令牌($\代理ID));
回显“访问令牌已过期”;//调试
}
如果(!$\u Google客户端->getAccessToken()){
echo“错误-管理员尚未正确设置分析”;
}

我需要一个函数来运行setRefreshToken之类的东西-从数据库输入值,从管理员那里输入值,然后再进行联机身份验证。

您可以尝试以下操作,您需要添加代码以将新令牌存储在数据库中

if($_googleClient->isAccessTokenExpired()) {
    // Don't think this is required for Analytics API V3
    //$_googleClient->refreshToken($_analytics->dbRefreshToken($_agencyId));
    echo 'Access Token Expired'; // Debug

    $_googleClient->authenticate();
    $NewAccessToken = json_decode($_googleClient->getAccessToken());
    $_googleClient->refreshToken($NewAccessToken->refresh_token);
}

使用try/catch并使用catch重定向/刷新访问令牌。 下面是我用于解决类似问题的解决方案:

$plus = new Google_Service_Plus($client);
try {
$me = $plus->people->get('me');
} catch(Exception $e){
        if(!(strpos($_SERVER["REQUEST_URI"],'logout'))){
         if (isset($authUrl)){
                $redirect = $authUrl;
        }
        else{
                  $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'] .'?logout';
        }
        header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
        exit;
}
您可以将try下的语句替换为抛出异常的行,我想这是正确的

$_googleClient->setClientId($_analytics->gaClientId);
或者,您也可以尝试根据此处给出的解决方案刷新令牌:


这就解决了问题,而且我尝试使用访问令牌刷新令牌,而不是使用刷新令牌作为参数#失败-谢谢!你们知道我如何使用刷新令牌函数来获取新的访问令牌,从而强制访问令牌过期以进行测试吗@mpark@Anagio您应该能够运行
$\u googleClient->refreshToken($NewAccessToken->refresh\u token)
强制使用新令牌。然后将旧的令牌与新的令牌进行比较,看看它是否发生了变化。我发现Google_Client::authenticate(),缺少参数1,有什么想法吗?Mark&RafaSashi:这个答案当时是有效的,看起来SDK已经更新了,所以不再有效。