我的问题:
如何收到扩展令牌,以便用户在一小时左右后不会退出?我有意请求离线访问,因为我读到必须接收刷新令牌。但是我没有在authResult
java-script变量中收到它。
我的代码:
这是我的用户使用他们的Google帐户登录我的网站的方式:
1 - 显示一个登录按钮。
<span id="signinButton">
<span class="g-signin" data-callback="signinCallback" data-clientid="********.apps.googleusercontent.com" data-access_type="offline" data-cookiepolicy="single_host_origin" data-requestvisibleactions="http://schema.org/AddAction" data-scope="https://www.googleapis.com/auth/plus.login https://www.googleapis.com/auth/plus.profile.emails.read https://www.googleapis.com/auth/offline"></span>
</span>
2 - 用户点击按钮后,正在进行ajax调用,并将访问令牌传递给服务器。
function signinCallback(authResult) {
if (authResult['status']['signed_in']) {
//Shoot the ajax
$.ajax({
//...Send the access token to the server
})
.done(function(msg) {
//...Do somthing after a sucessfull login
});
} else {
//...
}
}
3 - PHP函数接收令牌并将其保存在$_SESSION
变量中供以后使用。
public function GoogleAuth($token) {
$_SESSION['google_token'] = $token;
#See that the token is valid
$session_status = $this->GetSessionStatus($token, 'all');
if ($session_status == false) {
return $session_status;
}
#If token is valid, manage the registration/login process
//...
}
4 - 这是检查令牌是否有效的函数:
public function GetSessionStatus($token) {
$url = 'https://www.googleapis.com/oauth2/v1/userinfo';
$params = 'access_token='.$token;
$ch = curl_init($url . '?' . $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
if (!empty($headers)) curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$user = curl_exec($ch);
$user = json_decode($user);
curl_close($ch);
if (isset($user->id)) {
return true;
} else {
return false;
}
}
再次提出我的问题,以防忘记:)
所以这就是我处理登录的方式。我不确定我是否正确处理,但它确实有效。
我的问题是如何才能收到扩展令牌,这样用户一小时后就不会被注销。我有意请求离线访问,因为我读到必须接收刷新令牌。但是我没有在authResult
java-script变量中收到它。
编辑:结束时(如何解决):
首先,我使用$_SESSION
而不是$_COOKIE
。它更永久。
其次,我切换到所有PHP sdk以便接收刷新令牌。
答案 0 :(得分:1)
使用Javascript意味着您正在使用所谓的OAuth 2.0隐式授权,并且由于安全性限制,授权类型无法返回刷新令牌。规范在https://tools.ietf.org/html/rfc6749#section-4.2.2部分中说明:
授权服务器不得发出刷新令牌。
这是因为Javascript客户端无法安全存储长期令牌。你最好使用服务器端流程,例如使用google-api-php-client
,您还可以安全地存储和重用刷新令牌。