【问题标题】:google OAuth 2 new tokens always expired谷歌 OAuth 2 新令牌总是过期
【发布时间】:2018-09-07 01:47:15
【问题描述】:

我已经完成了谷歌请求帐户权限并要求用户验证的授权步骤,它返回访问令牌,刷新令牌类型承载。

然后我将令牌保存在数据库中。 在另一个 php 文件中,我使用以下代码:

require __DIR__ . '/foo/Google/autoload.php';
$client = new Google_Client();
$client->setClientId("foo.apps.googleusercontent.com");
$client->setClientSecret("foo");
$client->setAccessToken($access_token);
$expired = $client->isAccessTokenExpired();
if($expired == 1)
{
$new_token = $client->fetchAccessTokenWithRefreshToken($refresh_token);
print_r($new_token);
$access_token = $new_token['access_token'];
send("UPDATE `foo_table` SET `access_token`='$access_token' WHERE `foo` = '$foo'");
$client->setAccessToken($access_token);
$expired = $client->isAccessTokenExpired();
echo $expired;
} 
if($expired == 0)
{ 
code..

我总是得到一个新的令牌,和相同的初始刷新令牌,但它总是过期,在同一页面和刷新时(使用存储的令牌)。 php在google api的授权Uris中

Array
(
[access_token] = foobar
[token_type] = Bearer
[expires_in] = 3600
[created] = 1522234588
[refresh_token] = Foobar
)
1 (Expired)

我将它用于 gmail api,初始范围:

$client->addScope("https://mail.google.com/");
$client->addScope("https://www.googleapis.com/auth/gmail.compose");
$client->addScope("https://www.googleapis.com/auth/gmail.send");
$client->addScope("https://www.googleapis.com/auth/gmail.readonly");

【问题讨论】:

    标签: php google-oauth gmail-api


    【解决方案1】:

    如果您真的想要/需要将访问令牌存储在数据库中,您可以执行以下操作。由于访问令牌是一个包含access_tokenexpires_inscopetoken_type 等的数组,因此您必须将整个数组存储在数据库中。你可以这样做:

    $accessToken = $client->getAccessToken();
    $serializedAccessToken = serialize($accessToken);
    
    $insertIntoDatabase = insert($serializedAccessToken)......
    

    现在,如果您想从数据库中检索访问令牌并检查它是否已过期,您可以这样做:

    $getAccessToken = getFromDatabase...
    $accessTokenArray = unserialize($getAccessToken);
    
    if($client->isAccessTokenExpired()) {
        $client->refreshToken($refreshToken);
    }
    

    【讨论】:

      【解决方案2】:

      我认为您误解了访问令牌和刷新令牌的用法。将访问令牌保存到数据库是没有意义的。访问令牌只能使用一小时。您应该保存刷新令牌。

      当您的代码需要运行时,您可以获取刷新令牌并请求新的访问令牌。

      if ($client->isAccessTokenExpired()) {              
                      $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
                      $client->setAccessToken($client->getAccessToken()); 
                      $_SESSION['access_token'] = $client->getAccessToken();              
                  }           
      

      Oauth2Authentication.php 窃取的代码

      【讨论】:

        猜你喜欢
        • 2021-09-30
        • 2015-05-17
        • 2016-07-10
        • 2013-09-13
        • 2015-11-04
        • 2021-06-14
        • 2014-07-09
        • 1970-01-01
        • 2022-11-11
        相关资源
        最近更新 更多