【问题标题】:Returning back refresh token for google Oauth 2 using php client使用 php 客户端返回 google Oauth 2 的刷新令牌
【发布时间】:2021-09-09 18:49:54
【问题描述】:

我正在使用 JS 库 https://apis.google.com/js/platform.js 登录我的用户以将令牌传递给我的后端:

            gapi.auth2.getAuthInstance().signIn().then(() => {
                var user = gapi.auth2.getAuthInstance().currentUser.get();
                var authResp = user.getAuthResponse();
                var bodyFormData = new FormData();
                bodyFormData.append('google_token', authResp.access_token);

当我在服务器上收到访问令牌时,我尝试使用 php 客户端库来生成客户端的其余部分:

        $google = new google();
        $google->setAuthConfig('client_secrets.json');
        $google->setAccessType('offline');
        $google->createAuthUrl();
        $google->getRefreshToken();
        $google->setAccessToken($thePOSTedAccessToken);
        $service = new Google_Service_MyBusiness($google);

问题是,无论我做什么,我都无法在创建 $client->createAuthUrl(); 后从 client.auth 获取我的刷新令牌。所以这要么意味着我没有在 php 中正确地做客户端,要么是其他错误。我问这个问题是因为我已经遵循了所有文档并广泛研究了为什么我没有收到更新。

【问题讨论】:

  • 这将使您对您的情况有所了解。 stackoverflow.com/a/10857806/16327700
  • 非常感谢,我确实看过$google->setAccessType('offline');。即使我尝试在第一次登录时访问刷新,我也没有获得刷新令牌(这是在从谷歌帐户中删除应用程序之后)

标签: javascript php google-oauth google-api-php-client google-api-js-client


【解决方案1】:

你不能混合这样的东西。如果授权代码是使用 JavaScript 创建的,您将无法获得刷新令牌,因为 JavaScript 不支持刷新令牌。

如果您需要刷新令牌,则需要使用服务器端语言而不是客户端语言授权用户。

当您第一次运行代码时,将显示用户同意屏幕。如果他们同意您的访问,那么您会收到一个返回的代码。这是一个授权码。

在下面的示例中,您可以看到授权代码如何交换访问令牌和刷新令牌。

只有在 $client->authenticate($_GET['code']); 被调用后,$client->getAccessToken();$client->getRefreshToken(); 才能工作。

此外,一旦代码运行一次,如果您再次尝试授权用户,您将不会获得新的刷新令牌,Google 会假定您保存了他们已经发送给您的刷新令牌。如果您没有保存它,则需要使用库中的 revoke 命令或转到用户的 Google 帐户并以这种方式撤消应用程序来撤消用户的访问权限。

抱歉,我手头只有网页版;不确定您是在运行此命令行还是基于 Web。

require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/Oauth2Authentication.php';

// Start a session to persist credentials.
session_start();

// Handle authorization flow from the server.
if (! isset($_GET['code'])) {
    $client = buildClient();
    $auth_url = $client->createAuthUrl();
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
} else {
    $client = buildClient();
    $client->authenticate($_GET['code']); // Exchange the authencation code for a refresh token and access token.
    // Add access token and refresh token to session.
    $_SESSION['access_token'] = $client->getAccessToken();
    $_SESSION['refresh_token'] = $client->getRefreshToken();    
    //Redirect back to main script
    $redirect_uri = str_replace("oauth2callback.php",$_SESSION['mainScript'],$client->getRedirectUri());    
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL));
}

?>

【讨论】:

猜你喜欢
  • 2018-04-22
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-10
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
相关资源
最近更新 更多