【问题标题】:Google Access token not refreshing automatically with offline accessGoogle 访问令牌不会在离线访问时自动刷新
【发布时间】:2020-08-21 03:13:32
【问题描述】:

我正在开发一个 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.

所以如果我正确阅读了这个,客户端会自动刷新访问令牌而不需要我做任何事情?

当我使用 $this->client->getAccessToken() 时,使用 Google 客户端执行所有操作后访问令牌不存在。如果我 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。谁能给个提示??

【问题讨论】:

    标签: php oauth-2.0 google-oauth google-api-php-client google-client


    【解决方案1】:

    我将其发布为答案,因为它暂时解决了我的问题,但不知道这是否是一个好习惯。谷歌的例子似乎暗示我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;
        }
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2021-04-12
      • 2020-12-09
      • 2013-03-16
      • 2021-09-23
      • 2015-10-05
      • 1970-01-01
      • 2017-06-09
      • 2019-06-29
      • 2012-11-26
      相关资源
      最近更新 更多