我正在使用Google API Client for Google Analytics with OAuth 2.0
我读这个来获得刷新令牌,但它没有出现: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请求以获取刷新令牌的原因。
您将仅在用户第一次授予访问您的应用程序的权限时获得refresh_token
。您需要将refresh_token存储在某个地方以便以后能够使用它。下次用户登录你的应用时,你不会得到一个新的刷新令牌。
fww:在Javascript客户端中使用刷新令牌没有多大意义,因为Javascript客户端无法以安全(机密)的方式存储它。由于Javascript客户端驻留在浏览器中,而用户也存在于浏览器中,因此您只需再次将浏览器重定向到授权端点,就会获得一个新的访问令牌(这也是刷新令牌的目的)。用户在Google的SSO会话将确保用户不需要再次登录,并且体验是无缝的。
查看@ cururious_coder的回复Google API刷新令牌
他解释了每次获得刷新令牌的方法:)这篇文章帮助我实现了这一目标,所以我想我应该把这篇文章分享给任何试图找到他们的刷新令牌的人。将此代码的最后两行添加到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将是一个对象数组。