Google Oauth2 API - 无刷新令牌

时间:2017-07-17 19:49:22

标签: oauth-2.0 google-api access-token google-api-php-client refresh-token

我尝试在Stack Exchange上提供许多解决方案来获取刷新令牌,但它们都失败了。下面是我的整个控制器。如您所见,我已添加$ client-> setAccessType('离线')和$ client-> setApprovalPrompt(' force')。

此外,我已多次运行撤销令牌,我已在此处访问了我的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);

  }
}
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

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

来源:我遇到了同样的问题,几乎把头发拉了出来后,我想出来了。