Google Oauth2 API - 无刷新令牌

问题描述:

我试图在Stack Exchange上提供很多解决方案来获取刷新令牌,并且它们都失败了。以下是我的整个控制器。正如你所看到的,我已经包含了$ client-> setAccessType('offline')和$ client-> setApprovalPrompt('force')。Google Oauth2 API - 无刷新令牌

此外,我已经多次运行撤销令牌,并且已经进入我的Google帐户(https://myaccount.google.com/permissions),并删除了访问权限。当我进行新的授权时,这些尝试都没有为我提供刷新标记。

<?php 
 
/** 
 
* @file 
 
* Contains \Drupal\hello\GAOauthController. 
 
*/ 
 

 
namespace Drupal\ga_reports_per_user\Controller; 
 

 
use Drupal\Core\Controller\ControllerBase; 
 
use Symfony\Component\HttpFoundation\RedirectResponse; 
 
use Drupal\Core\Routing\TrustedRedirectResponse; 
 
use Google_Client; 
 
use Google_Service_Analytics; 
 
use Drupal\group\Context\GroupRouteContextTrait; 
 

 
class GAOauthController extends ControllerBase { 
 

 
    use GroupRouteContextTrait; 
 

 
    public function authorize($group = NULL) { 
 
    $client = new Google_Client(); 
 
    $credentials_file = \Drupal::service('file_system')->realpath("private://") . '/client_credentials.json'; 
 
    $client->setAuthConfig($credentials_file); 
 
    $client->addScope(Google_Service_Analytics::ANALYTICS_READONLY); 
 

 
    if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { 
 
     $protocol = "https"; 
 
    } 
 
    else { 
 
     $protocol = "http"; 
 
    } 
 
    $redirect_uri = $protocol . '://' . $_SERVER['HTTP_HOST'] . '/finish_google_oauth'; 
 
    $client->setState($group); 
 
    $client->setRedirectUri($redirect_uri); 
 
    $client->setAccessType('offline'); 
 
    $client->setApprovalPrompt('force'); 
 
    $auth_url = $client->createAuthUrl(); 
 
    return new TrustedRedirectResponse($auth_url); 
 
    } 
 

 
    public function finishOauth() { 
 
    if (isset($_GET['code'])) { 
 
     $client = new Google_Client(); 
 
     $credentials_file = \Drupal::service('file_system')->realpath("private://") . '/client_credentials.json'; 
 
     $client->setAuthConfig($credentials_file); 
 
     $client->addScope(Google_Service_Analytics::ANALYTICS_READONLY); 
 
     if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { 
 
     $protocol = "https"; 
 
     } 
 
     else { 
 
     $protocol = "http"; 
 
     } 
 
     $redirect_uri = $protocol . '://' . $_SERVER['HTTP_HOST'] . '/finish_google_oauth'; 
 
     $client->setRedirectUri($redirect_uri); 
 
     $client->setAccessType('offline'); 
 
     $client->setApprovalPrompt('force'); 
 
     $client->authenticate($_GET['code']); 
 
     $token = $client->getAccessToken(); 
 
     $refreshToken = $client->getRefreshToken(); 
 
     $client->setAccessToken($token); 
 

 
     $group_entity = \Drupal::entityTypeManager()->getStorage('group')->load($_GET['state']); 
 

 
     $group_entity->field_google_oauth_token->value = $token['access_token']; 
 
     $group_entity->field_google_oauth_token_type->value = $token['token_type']; 
 
     $group_entity->field_google_oauth_token_created->value = $token['created']; 
 
     $group_entity->field_google_oauth_token_expire->value = $token['expires_in']; 
 

 
     $save_status = $group_entity->save(); 
 

 
     return new RedirectResponse('/group/' . $_GET['state']); 
 
    } 
 
    } 
 

 
    public function revoke($group = NULL){ 
 
    $client = new Google_Client(); 
 
    $group_entity = \Drupal::entityTypeManager()->getStorage('group')->load($group); 
 
    $result = $client->revokeToken($group_entity->field_google_oauth_token->value); 
 

 
    $group_entity->field_google_oauth_token->value = ''; 
 
    $group_entity->field_google_oauth_token_type->value = ''; 
 
    $group_entity->field_google_oauth_token_created->value = ''; 
 
    $group_entity->field_google_oauth_token_expire->value = ''; 
 

 
    $group_entity->save(); 
 

 
    return new RedirectResponse('/group/' . $group); 
 

 
    } 
 
}

如果您已经申请为该登录/ dev的访问令牌。令牌组合,它不会为你返回它。您必须通过https://myaccount.google.com/permissions撤销访问权限。找到您的应用,撤销访问权限,然后重试。

来源:我有这个完全相同的问题,几乎把我的头发拉出来后,我明白了这一点。

+0

看到我原来的帖子... “此外,我已经多次运行撤销令牌,并且已经进入我的Google帐户(https://myaccount.google.com/permissions),并且移除了访问权限这些尝试在我进行新的授权时都没有给我提供刷新标记。“ –

+0

啊,错过了。 Bummer :( –