Google登录扩展令牌

时间:2015-01-19 06:58:16

标签: javascript php google-oauth

我的问题:

如何收到扩展令牌,以便用户在一小时左右后不会退出?我有意请求离线访问,因为我读到必须接收刷新令牌。但是我没有在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以便接收刷新令牌。

1 个答案:

答案 0 :(得分:1)

使用Javascript意味着您正在使用所谓的OAuth 2.0隐式授权,并且由于安全性限制,授权类型无法返回刷新令牌。规范在https://tools.ietf.org/html/rfc6749#section-4.2.2部分中说明:

  

授权服务器不得发出刷新令牌。

这是因为Javascript客户端无法安全存储长期令牌。你最好使用服务器端流程,例如使用google-api-php-client,您还可以安全地存储和重用刷新令牌。