Google Oauth2 API - 无刷新令牌



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

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

<?php
/**
* @file
* Contains DrupalhelloGAOauthController.
*/
namespace Drupalga_reports_per_userController;
use DrupalCoreControllerControllerBase;
use SymfonyComponentHttpFoundationRedirectResponse;
use DrupalCoreRoutingTrustedRedirectResponse;
use Google_Client;
use Google_Service_Analytics;
use DrupalgroupContextGroupRouteContextTrait;
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);
}
}

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

来源:我遇到了完全相同的问题,在几乎拔掉头发之后,我想通了。

最新更新