Google Access令牌无法通过离线访问自动刷新

问题描述

我正在使用一个PHP Web应用程序,该应用程序在用户获得授权后会创建Google联系人。我不想每次创建新联系人时都提示用户,所以我发现了这一点:https://developers.google.com/identity/protocols/oauth2/web-server#offline

If your application needs offline access to a Google API,set the API client's access type to offline:

$client->setAccessType("offline");

After a user grants offline access to the requested scopes,you can continue to use the API client to access Google APIs on the user's behalf when the user is offline. The client object will refresh the access token as needed.

因此,如果我正确阅读了此内容,客户端将自动刷新访问令牌,而无需执行任何操作?

使用Google客户端执行所有操作后,当我使用 $ this-> client-> getAccessToken()时,访问令牌不存在。如果我使用var_dump,它将始终显示为NULL。 我应该怎么做才能使客户端自动刷新访问令牌?这是我的代码的输入内容,您会看到它不太复杂

我的模特

class PeopleModel{
  protected $client;
  public function __construct(){
     $this->client = new Google_Client();
     $this->client->setAuthConfig('credentials.json');
     $this->client->setScopes(Google_Service_PeopleService::CONTACTS);
     $this->client->setRedirectUri('my url');
     $this->client->setAccessType('offline');
     $this->client->setPrompt('consent');
     $this->client->setApprovalPrompt('auto');
     $this->client->setIncludeGrantedScopes(true);
  }

  public function getClient(){
    return $this->client;
  }
}

我的控制器

class GooglePeople extends Controller{

    protected $client;

    public function __construct(){
        $this->client = new PeopleModel();
        $this->client = $this->client->getClient();

        // we get code from the google auth page
        if( isset($_GET['code']) ){
            $token = $this->client->fetchAccessTokenWithAuthCode($_GET['code']);
            $acc_token = $this->client->getAccessToken();

            $this->client->setAccessToken($acc_token);
        }
    }

    public function index(){
        // we get code from the google auth page or the client as an acc token
        if (isset($_GET['code']) || $this->client->getAccessToken()) {
            // ... Do stuff with the PeopleService. So far no errors here

        }else{ // we redirect to google auth page to get auth code
            $auth_url = $this->client->createAuthUrl();
            if(!header('Location: '.filter_var($auth_url,FILTER_SANITIZE_URL))){
                exit('Header error');
            }
        }
    }

 }

我每次都被重定向,因为$ this-> client-> getAccessToken()为NULL 。谁能给我一个提示?

解决方法

我将其发布为答案,因为它暂时解决了我的问题,但不知道这是否是一个好习惯。 Google的示例似乎建议我save the acc_token to session and re-set it again every time。因此,我做到了,并且我假设客户端确实确实可以自行处理令牌刷新。如果我错了,请告诉我。我正在发布新代码

仅控制器已更改

<?php

namespace App\Http\Controllers;

use App\GooglePeople as PeopleModel;
use Illuminate\Http\Request;
use Google_Service_PeopleService;
use Google_Service_PeopleService_Person;
use Google_Service_PeopleService_EmailAddress;
use Google_Service_PeopleService_Name;

class GooglePeople extends Controller
{
    protected $client;

    public function __construct(){
        $this->client = new PeopleModel();
        $this->client = $this->client->getClient();

        if( array_key_exists('code',$_GET) && $_GET['code'] )
        {
            $token = $this->client->fetchAccessTokenWithAuthCode($_GET['code']);
            $acc_token = $this->client->getAccessToken();
            session(['acc_token' => $acc_token]);
            session()->save();
            // come back to this file
            redirect('/this_controller');
        }
    }

    public function index(){
        $isset_acctoken = $this->is_acctoken_saved();
        if ($isset_acctoken) {
            // We do stuff with the Google Api,so far no errors here..

        }else{
            $auth_url = $this->client->createAuthUrl();
            redirect()->away('$auth_url');  
        }
    }

    // For some reason I cant retrieve session values in construct
    private function is_acctoken_saved(){
        if(session('acc_token')){
            $this->client->setAccessToken(session('acc_token'));
            return true;
        }

        return false;
    }
}
?>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...