Google OAuth:无法使用授权码获取刷新令牌

时间:2015-07-21 17:25:14

标签: google-api google-oauth google-analytics-api google-api-php-client google-api-client

我正在使用适用于OAuth 2.0的Google Analytics的Google API客户端

我看了这个以获取刷新令牌,但它没有出现:https://developers.google.com/identity/protocols/OAuth2WebServer#offline

我只能这样做:

{
 "access_token": "ya29.twHFi4LsiF-AITwzCpupMmie-fljyTIzD9lG8y_OYUdEGKSDL7vD8LPKIqdzRwvoQAWd",
 "token_type": "Bearer",
 "expires_in": 3599,
 "id_token": "very long string"
}

以下是代码:

Javascript(获取授权码): 有效

gapi.analytics.ready(function() {

    gapi.analytics.auth.authorize({
        container: 'embed-api-auth-container',
        clientid: '257497260674-ji56vq885ohe9cdr1j6u0bcpr6hu7rde.apps.googleusercontent.com',
    });

    gapi.analytics.auth.on('success', function(response) {
        var code = response.code;
        $.ajax({
            url: "getTokensFromCode.php",
            method: "GET",
            data: {
                "code": code
            },
            success: function (tokens) {
                // I can't get refresh token here, only get "access_token" and "id_token"
                console.log(tokens);
            }
        });


    });

});

PHP(用于交换令牌的授权码): 无法正常工作

// I get the authorization code in Javascript
$code = $_GET['code'];
$redirectURI = "postmessage";

$client = new Google_Client();
$client->setClientId($clientID);
$client->setClientSecret($clientSecret);
$client->setRedirectUri($redirectURI);
$client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->authenticate($code);

$tokens = $client->getAccessToken();
echo $tokens;

我需要Javascript中的刷新令牌,这就是我在Javascript中获取授权代码并发出Ajax请求以获取刷新令牌的原因。

2 个答案:

答案 0 :(得分:1)

您只能在用户首次授予您的应用访问权限时获得refresh_token。您需要将refresh_token存储在某处以便以后可以使用它。下次用户登录您的应用时,您将无法获得新的刷新令牌。

FWIW:在Javascript客户端中使用刷新令牌没有多大意义,因为Javascript客户端无法以安全(保密)方式存储它。由于Javascript客户端存在于浏览器中并且用户存在于浏览器中,因此您可以再次将浏览器重定向到授权端点,并且您将获得新的访问令牌(这也是刷新令牌的目的)。 Google用户的SSO会话将确保用户无需再次登录,并且体验无缝。

答案 1 :(得分:0)

通过@curious_coder查看此回复 Google API Refresh Token

他解释了每次获得刷新令牌的方法:)生命保护。这篇文章帮助我实现了这一点,所以我想我会分享给其他任何试图找到他们的刷新令牌的人。将此代码的最后两行添加到您的Auth进程

$client = new Google_Client();
$client->setAuthConfigFile(__DIR__ . '/client_secrets.json');
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/dashboard/oauthcallbacks');
$client->addScope(Google_Service_Analytics::ANALYTICS_READONLY);    
$client->setAccessType('offline'); //To fetch refresh token(Refresh token issued only first time)
$client->setApprovalPrompt('force'); //Adding this will force for refresh token

我还使用var_dump($ tokens)来获取内容而不是echo。不记得它是否会在PHP中产生影响,但$ tokens将是一个对象数组。