2

我使用谷歌API客户端的谷歌分析使用OAuth 2.0谷歌的OAuth:无法获取刷新令牌与授权码

我读这得到刷新令牌,但不会出现它: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(获取Authorizat离子码):的作品

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请求来获取刷新令牌的原因。

回答

1

用户授予访问您的应用第一次获得refresh_token。您需要将refresh_token存储在某个地方,以便以后可以使用它。下次用户登录到您的应用时,您不会获得新的刷新令牌。在Javascript客户端中使用刷新令牌没有什么意义,因为Javascript客户端无法以安全(保密)的方式存储它。由于Javascript客户端位于浏览器中,并且用户位于浏览器中,因此您可以重新将浏览器重定向到授权端点,并且您将获得新的访问令牌(这也是刷新令牌的用途)。 Google用户的SSO会话将确保用户不需要再次登录,并且体验无缝。

+0

我需要授予访问权限一次,并且无需再次登录(我需要向我的网站的访问者显示数据)而始终获取分析数据。这就是为什么我要'refresh_token'('access_token'只能持续1小时)。 为了在第一次登录后获得'refresh_token',我试过了这个: '$ client-> setAccessType('offline'); $ client-> setApprovalPrompt('force');' – enguerran

+0

我撤销了访问并再次登录,它没有给我一个'refresh_token'。无论如何,我认为JS-Ajax-PHP没有用,我会尝试一个完整的PHP解决方案,如Google文档所示。我尝试过这种方法,因为我想用Javascript中的'refresh_token',但正如你所说的那样,反正它不安全。 – enguerran

0

退房由@curious_coder Google API Refresh Token

他解释的方式来获取刷新令牌每一次:)生命的救星此响应。这篇文章帮助我到达那里,所以我想我会分享这个为其他人试图找到他们的刷新令牌。这段代码的最后两行添加到您的验证过程

$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($令牌)来获得内容,而不是回声。不要记得它是否会在PHP中有所作为,但$标记将是一组对象。

相关问题