Google Api Php 客户端的刷新令牌

Posted

技术标签:

【中文标题】Google Api Php 客户端的刷新令牌【英文标题】:Refresh Token for Google Api Php Client 【发布时间】:2012-06-25 10:55:08 【问题描述】:

我正在使用 Google API 客户端访问 Google Analytics。我想在离线模式下访问数据,所以我需要一个刷新令牌。如何获得 refresh_token?

【问题讨论】:

注意:如果您的 getAccessToken 响应不包含刷新令牌,即使您像在智能代码的示例代码中那样执行此操作,您可能需要撤消应用程序的访问权限并启动身份验证(作为用户)所有重来一遍,因为 Google 会记住之前的尝试,如果您之前没有提供“离线”访问权限,那么您以后将不会自动获得它。 -> security.google.com/settings/security/permissions 这条评论拯救了我的一天^^^ 在本地开发过程中,我在任何地方都找不到刷新令牌,我所要做的就是撤销应用程序并重试。 【参考方案1】:

尝试使用以下代码:

    <?php
        require_once 'apiClient.php';

        const REDIRECT_URL = 'INSERT YOUR REDIRECT URL HERE';
        const CLIENT_ID = 'INSERT YOUR CLIENT ID HERE';
        const CLIENT_SECRET = 'INSERT YOUR CLIENT SECRET';
        const ANALYTICS_SCOPE = 'https://www.googleapis.com/auth/analytics.readonly';

        // Build a new client object to work with authorization.
        $client = new apiClient();
        $client->setClientId(CLIENT_ID);
        $client->setClientSecret(CLIENT_SECRET);
        $client->setRedirectUri(REDIRECT_URL);
        $client->setScopes(array(ANALYTICS_SCOPE));
        $client->setAccessType('offline');
        $auth = $client->authenticate();


        if ($client->getAccessToken()) 
           $token = $client->getAccessToken();
           $authObj = json_decode($token);
           $refreshToken = $authObj->refresh_token;
        
        ?>

【讨论】:

这个函数怎么样,if (isset($_GET['code'])) $client->authenticate(); $_SESSION['token'] = $client->getAccessToken(); $redirect = 'http://' 。 $_SERVER['HTTP_HOST'] 。 $_SERVER['PHP_SELF']; header('位置:' . filter_var($redirect, FILTER_SANITIZE_URL)); if (isset($_SESSION['token'])) $client->setAccessToken($_SESSION['token']); print_r($_SESSION['token']); if (!$client->getAccessToken()) $authUrl = $client->createAuthUrl(); print "联系我!"; else // 创建分析服务对象。请参阅下面的下一步。 $analytics = 新的 Google_AnalyticsService($client); runMainDemo($analytics);任何提示我应该把你的功能放在哪里,或者我应该修改这些功能之一,任何帮助将不胜感激!非常感谢!【参考方案2】:

适用于 Google Client v2 的 PHP SDK:

php composer.phar require google/apiclient:^2.0

您可以尝试使用PHP代码刷新accessToken如下:

<?php

require_once __DIR__ . '/vendor/autoload.php';

define('CLIENT_SECRET_PATH', __DIR__ . '/client_secret.json');
define('SCOPES', implode(' ', array(
  Google_Service_Analytics::ANALYTICS_READONLY)
));

$client = new Google_Client();
$client->setApplicationName('YOUR APPLICATION NAME');
$client->setScopes(SCOPES);
$client->setAuthConfig(CLIENT_SECRET_PATH);
$client->setAccessType('offline');

// Input AccessToken from such as session or database 
$accessToken = json_decode('YOUR CURRENT ACEESS TOKEN');

$client->setAccessToken($accessToken);

// Refresh the token if it's expired.
if ($client->isAccessTokenExpired()) 
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    // Get RefreshToken as json which can be reused
    $refreshToken = json_encode($client->getAccessToken());


离线访问问题

另外,如果你想在你的服务器端应用程序中保留现有的行为,你需要将approval_prompt设置为force,否则你可能会得到从getRefreshToken()返回的NULL,而Google文档没有提及:

$client->setApprovalPrompt('force');

转介Upcoming changes to OAuth 2.0 endpoint

【讨论】:

感谢您提及 setApprovalPrompt() 步骤。我终于得到了刷新令牌。

以上是关于Google Api Php 客户端的刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Google api 客户端获取刷新令牌并上传文件

Google API 客户端“刷新令牌必须传入或设置为 setAccessToken 的一部分”

访问令牌 Google API 的刷新令牌:R 代码

Google API PHP 客户端授权

在客户端的哪里存储刷新令牌?

无法获取 google play 授权的刷新令牌