Google APIクライアントでトークンを更新する方法は?


91

私はGoogle Analytics API(V3)で遊んでいて、somエラーに遭遇しました。まず、すべてが正しく設定され、私のテストアカウントで機能します。しかし、別のプロファイルID(同じGoogle Accont / GAアカウント)からデータを取得したい場合、403エラーが発生します。奇妙なことに、一部のGAアカウントのデータはデータを返し、他のアカウントはこのエラーを生成します。

トークンを取り消してもう一度認証したところ、すべてのアカウントからデータを取得できるようになりました。問題が解決しました?ない。アクセスキーの有効期限が切れると、同じ問題が再び発生します。

私が正しく理解していれば、resfreshTokenを使用して新しいauthenticationTookenを取得できます。

問題は、私が実行すると:

$client->refreshToken(refresh_token_key) 

次のエラーが返されます。

Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant" }'

refreshTokenメソッドの背後にあるコードをチェックして、リクエストを「apiOAuth2.php」ファイルに追跡しました。すべてのパラメーターが正しく送信されます。grant_typeはメソッド内で 'refresh_token'にハードコーディングされているため、何が問題なのかを理解するのは困難です。パラメータ配列は次のようになります。

Array ( [client_id] => *******-uqgau8uo1l96bd09eurdub26c9ftr2io.apps.googleusercontent.com [client_secret] => ******** [refresh_token] => 1\/lov250YQTMCC9LRQbE6yMv-FiX_Offo79UXimV8kvwY [grant_type] => refresh_token )

手順は以下の通りです。

$client = new apiClient();
$client->setClientId($config['oauth2_client_id']);
$client->setClientSecret($config['oauth2_client_secret']);
$client->setRedirectUri($config['oauth2_redirect_uri']);
$client->setScopes('https://www.googleapis.com/auth/analytics.readonly');
$client->setState('offline');

$client->setAccessToken($config['token']); // The access JSON object.

$client->refreshToken($config['refreshToken']); // Will return error here

これはバグですか、それとも完全に誤解していますか?


それがバグなのか何かわからないが、私は現在、生のCURL httpリクエストを使用してアクセストークンを更新しており、正常に動作している。
グレモ

ソーク...これはもうわかったの?ここで同じ問題。
ブライアンヴァンダーブッシュ2012

@gremoここで使用した生のCURL httpリクエストを共有できますか?本当に参考になります。ありがとう!
Silver Ringvee

回答:


76

だから私は最終的にこれを行う方法を見つけました。基本的な考え方は、最初に認証を要求するときに取得するトークンを持っているということです。この最初のトークンには更新トークンがあります。最初の元のトークンは1時間後に期限切れになります。1時間後、最初のトークンの更新トークンを使用して、新しい使用可能なトークンを取得する必要があります。$client->refreshToken($refreshToken)新しいトークンを取得するために使用します。これを「一時トークン」と呼びます。この一時トークンも保存する必要があります。1時間後にも有効期限が切れ、更新トークンが関連付けられていないことに注意してください。新しい一時トークンを取得するには、以前に使用したメソッドを使用し、最初のトークンの更新トークンを使用する必要があります。以下のコードを添付しましたが、これは醜いですが、これは新しいです...

//pull token from database
$tokenquery="SELECT * FROM token WHERE type='original'";
$tokenresult = mysqli_query($cxn,$tokenquery);
if($tokenresult!=0)
{
    $tokenrow=mysqli_fetch_array($tokenresult);
    extract($tokenrow);
}
$time_created = json_decode($token)->created;
$t=time();
$timediff=$t-$time_created;
echo $timediff."<br>";
$refreshToken= json_decode($token)->refresh_token;


//start google client note:
$client = new Google_Client();
$client->setApplicationName('');
$client->setScopes(array());
$client->setClientId('');
$client->setClientSecret('');
$client->setRedirectUri('');
$client->setAccessType('offline');
$client->setDeveloperKey('');

//resets token if expired
if(($timediff>3600)&&($token!=''))
{
    echo $refreshToken."</br>";
    $refreshquery="SELECT * FROM token WHERE type='refresh'";
    $refreshresult = mysqli_query($cxn,$refreshquery);
    //if a refresh token is in there...
    if($refreshresult!=0)
    {
        $refreshrow=mysqli_fetch_array($refreshresult);
        extract($refreshrow);
        $refresh_created = json_decode($token)->created;
        $refreshtimediff=$t-$refresh_created;
        echo "Refresh Time Diff: ".$refreshtimediff."</br>";
        //if refresh token is expired
        if($refreshtimediff>3600)
        {
            $client->refreshToken($refreshToken);
        $newtoken=$client->getAccessToken();
        echo $newtoken."</br>";
        $tokenupdate="UPDATE token SET token='$newtoken' WHERE type='refresh'";
        mysqli_query($cxn,$tokenupdate);
        $token=$newtoken;
        echo "refreshed again";
        }
        //if the refresh token hasn't expired, set token as the refresh token
        else
        {
        $client->setAccessToken($token);
           echo "use refreshed token but not time yet";
        }
    }
    //if a refresh token isn't in there...
    else
    {
        $client->refreshToken($refreshToken);
        $newtoken=$client->getAccessToken();
        echo $newtoken."</br>";
        $tokenupdate="INSERT INTO token (type,token) VALUES ('refresh','$newtoken')";
        mysqli_query($cxn,$tokenupdate);
        $token=$newtoken;
        echo "refreshed for first time";
    }      
}

//if token is still good.
if(($timediff<3600)&&($token!=''))
{
    $client->setAccessToken($token);
}

$service = new Google_DfareportingService($client);

52
3600秒をチェックする代わりに、$ client-> isAccessTokenExpired()を使用する必要があります
Gaurav Gupta 2014

2
小さな更新。最新バージョンでは、更新トークンを要求すると、返される新しいアクセストークンに新しい更新トークンが付属します。したがって、基本的には、更新されたjsonトークンを使用して以前のjsonトークンを置き換えることができ、初期アクセストークンを保持する必要がなくなります。。
スキダドン

1
$client->isAccessTokenExpired()まだのみ、トークンの有効期限が切れていると考えるかどうかを確認するためにローカルに保持時間を確認します。トークンはまだ有効期限が切れている可能性があり、ローカルアプリケーションはそれをいつ使用しようとしたのかを本当に知るだけです。この場合、APIクライアントは例外を返し、トークンを自動的に更新しません
Jason

44

問題は更新トークンにあります:

[refresh_token] => 1\/lov250YQTMCC9LRQbE6yMv-FiX_Offo79UXimV8kvwY

aを含む文字列'/'json encoded、でエスケープされるため'\'、削除する必要があります。

あなたの場合の更新トークンは次のようになります:

1/lov250YQTMCC9LRQbE6yMv-FiX_Offo79UXimV8kvwY

私はあなたがやったと仮定していることはあなた場合ので、あなたは、Googleが返送されたJSON文字列を印刷し、コピーして、あなたのコードにトークン貼り付けたことでjson_decode、それはそれは正しく削除されます'\'、あなたのために!


1
素晴らしい言及、私の一日を作りました!時間節約!
Mircea Sandu、2014年

あなたは私の日を救った!
Truong Dang

これを100回賛成できればいいのに。トークンを完全に機能させるためにすべてを試した後、「bad grant」メッセージを数時間見つめた後、キーボードで壁に穴を開けようとしていました。グーグルマン、なぜスラッシュを使うの?
Askerman

18

トークンを設定するスニペットを次に示します。その前に、アクセスタイプをオフラインに設定する必要があります。

if (isset($_GET['code'])) {
  $client->authenticate();
  $_SESSION['access_token'] = $client->getAccessToken();
}

トークンを更新するには

$google_token= json_decode($_SESSION['access_token']);
$client->refreshToken($google_token->refresh_token);

これはあなたのトークンを更新します、あなたはあなたができることのためにセッションでそれを更新しなければなりません

 $_SESSION['access_token']= $client->getAccessToken()

1
あなたはこれで私の一日を作りました:)ありがとうございます、私は何もないところに多くの時間を費やしていたので、私が思っていたよりもずっとシンプルです:D
TB Ygg '27

16

アクセスタイプはに設定する必要がありますofflinestateAPIの使用ではなく、独自の使用のために設定する変数です。

クライアントライブラリが最新バージョンであることを確認し、以下を追加します。

$client->setAccessType('offline');

パラメーターの説明については、URLの形成を参照してください。


ありがとうjk。最新バージョンをダウンロードし、自分のアカウントのアプリへのアクセスを取り消しました。次に、もう一度アクセスを許可し、accessTokenとrefreshTokenを保存しました。問題は、setAccessTypeが省略されている場合でも、常にrefreshTokenが与えられていることです。とにかく、$ client-> refreshToken(refresh-token-key)を実行しても、「invalid_grant」エラーが発生します。私はauth-urlをチェックしましたが、デフォルトは「force」です。「auto」に変更して認証メソッドを実行すると、すでにアクセスを許可しているため、リダイレクトされません。しかし、応答は、更新トークンがないaccessTokenです。何か案は?
seorch.me

@ seorch.me奇妙に聞こえますが、更新トークンを使用するために新しい$client$client = new apiClient();)を設定する必要がある可能性はありますか?
jk。

1
@ seorch.meを設定し$client->setApprovalPrompt('force')$client->setAccessType('offline')承認時に新しい更新トークンを取得する必要があります。ユーザーにアクセス範囲の承認を強制せずに、Googleは古い更新トークンの使用を継続すると想定します。
Jason

14

@ uri-wegが投稿した答えは私にとってはうまくいきましたが、彼の説明があまり明確ではなかったので、少し言い換えてみましょう。

最初のアクセス許可シーケンスのコールバックで、認証コードを受け取るポイントに到達したら、アクセストークンと更新トークン保存する必要があります

理由は、Google APIがアクセストークンを要求したときにのみ、更新トークンを含むアクセストークンを送信するためです。次のアクセストークンは、更新トークンなしで送信されます(approval_prompt=forceオプションを使用しない場合)。

初めて受け取った更新トークンは、ユーザーがアクセス許可を取り消すまで有効です。

単純なphpでは、コールバックシーケンスの例は次のようになります。

// init client
// ...

$authCode = $_GET['code'];
$accessToken = $client->authenticate($authCode);
// $accessToken needs to be serialized as json
$this->saveAccessToken(json_encode($accessToken));
$this->saveRefreshToken($accessToken['refresh_token']);

その後、単純化したphpでは、接続シーケンスは次のようになります。

// init client
// ...

$accessToken = $this->loadAccessToken();
// setAccessToken() expects json
$client->setAccessToken($accessToken);

if ($client->isAccessTokenExpired()) {
    // reuse the same refresh token
    $client->refreshToken($this->loadRefreshToken());
    // save the new access token (which comes without any refresh token)
    $this->saveAccessToken($client->getAccessToken());
}

完璧、たくさん働いた。私が言えることは、トークンだけではなくjsonオブジェクトを文字列として渡す必要があることを説明する必要があるということです。
Oliver Bayes-Shelton

@ OliverBayes-Sheltonこんにちは。ありがとう。// setAccessToken() expects json十分だと思いました。それともコードの別の部分ですか?
大師

これは私にとってはうまく機能しますが、このコードが50トークンの更新の制限を超えたためにトークンが期限切れになる状況を処理するかどうかを知っていますか?「トークンの有効期限」の詳細については、developers.google.com
ビョルン

最新の2.0バージョンが、アクセストークン配列で更新トークンを返しているようです。つまり、更新トークンが含まれているため、アクセストークンを保存すると更新トークンも保存されます。更新トークンの期限切れに対応して、明示的にテストして処理する必要があると思います-50の制限は「クライアントごとのユーザーごと」であることを覚えておいてください。つまり、クライアントごとに50であるため、特にヒットした場合含まれているスコープを使用してトークンを結合します。
Brian C

8

これが私のプロジェクトで使用しているコードで、正常に動作しています。

public function getClient(){
    $client = new Google_Client();
    $client->setApplicationName(APPNAME);       // app name
    $client->setClientId(CLIENTID);             // client id
    $client->setClientSecret(CLIENTSECRET);     // client secret 
    $client->setRedirectUri(REDIRECT_URI);      // redirect uri
    $client->setApprovalPrompt('auto');

    $client->setAccessType('offline');         // generates refresh token

    $token = $_COOKIE['ACCESSTOKEN'];          // fetch from cookie

    // if token is present in cookie
    if($token){
        // use the same token
        $client->setAccessToken($token);
    }

    // this line gets the new token if the cookie token was not present
    // otherwise, the same cookie token
    $token = $client->getAccessToken();

    if($client->isAccessTokenExpired()){  // if token expired
        $refreshToken = json_decode($token)->refresh_token;

        // refresh the token
        $client->refreshToken($refreshToken);
    }

    return $client;
}

6

同じ問題があった; 昨日は機能した私のスクリプトですが、奇妙な理由で今日は機能しませんでした。変更なし。

どうやらこれは、システムクロックが2.5(!!)秒ずれていたためであり、NTPとの同期によって修正されました。

参照:https : //code.google.com/p/google-api-php-client/wiki/OAuth2#Solving_invalid_grant_errors


その答えは私を大いに助けてくれました。あなたはおそらく私に多くの時間を節約しました。たくさん!ありがとう!sudo apt-get install ntpDebianマシンで実行してNTPをインストールしました。時計を同期させ、問題を解決しました。
SzymonSadło2017

4

参考:3.0 Google Analytics APIは、有効期限が切れたときに更新トークンがある場合、アクセストークンを自動的に更新するため、スクリプトは必要ありませんrefreshToken

(のSign機能を参照してくださいauth/apiOAuth2.php


「自動更新」とは、getAccessToken()を要求するだけで更新されたものを取得することを意味しますか?しかし、私は最初にDBからリフレッシュトークンを設定する必要がありますよね?それ以外の場合、更新トークンなしで更新が機能し、私はこれが機能するとは思わない
ninsky

4

リフレッシュトークンを使用して生成されないことがあり$client->setAccessType ("offline");ます。

これを試して:

$client->setAccessType ("offline");
$client->setApprovalPrompt ("force"); 

具体的には、更新トークンが最初の認証に含まれているようです。保存して使用した場合、私は(検証されていない他の人によると)更新トークンが引き続き返されると信じています。docoはまた、更新トークンがある場合、アクセストークンを自動更新することも述べています。つまり、更新トークンを安全に管理するだけのことです。setApprovalPrompt( 'force')は、強制的にリフレッシュトークンを後で発行します。それがなければ、あなたは別のものを得ることはありません。
ブライアンC

2

現在のバージョンのGoogle APIでsmartcodesの例を使用しましたが、それは機能しませんでした。彼のAPIは古すぎると思います。

したがって、APIの例の1つに基づいて、独自のバージョンを作成しただけです...アクセストークン、リクエストトークン、トークンタイプ、IDトークン、有効期限、作成時間を文字列として出力します

クライアントの資格情報と開発者キーが正しい場合、このコードはそのまま使用できます。

<?php
// Call set_include_path() as needed to point to your client library.
require_once 'google-api-php-client/src/Google_Client.php';
require_once 'google-api-php-client/src/contrib/Google_Oauth2Service.php';
session_start();

$client = new Google_Client();
$client->setApplicationName("Get Token");
// Visit https://code.google.com/apis/console?api=plus to generate your
// oauth2_client_id, oauth2_client_secret, and to register your oauth2_redirect_uri.
$oauth2 = new Google_Oauth2Service($client);

if (isset($_GET['code'])) {
    $client->authenticate($_GET['code']);
    $_SESSION['token'] = $client->getAccessToken();
    $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
    return;
}

if (isset($_SESSION['token'])) {
    $client->setAccessToken($_SESSION['token']);
}

if (isset($_REQUEST['logout'])) {
    unset($_SESSION['token']);
    $client->revokeToken();
}
?>
<!doctype html>
<html>
    <head><meta charset="utf-8"></head>
    <body>
        <header><h1>Get Token</h1></header>
        <?php
        if ($client->getAccessToken()) {
            $_SESSION['token'] = $client->getAccessToken();
            $token = json_decode($_SESSION['token']);
            echo "Access Token = " . $token->access_token . '<br/>';
            echo "Refresh Token = " . $token->refresh_token . '<br/>';
            echo "Token type = " . $token->token_type . '<br/>';
            echo "Expires in = " . $token->expires_in . '<br/>';
            echo "ID Token = " . $token->id_token . '<br/>';
            echo "Created = " . $token->created . '<br/>';
            echo "<a class='logout' href='?logout'>Logout</a>";
        } else {
            $authUrl = $client->createAuthUrl();
            print "<a class='login' href='$authUrl'>Connect Me!</a>";
        }
        ?>
    </body>
</html>

1
どうしてこの行なのか説明してください$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];。同じページにリダイレクトするのはなぜですか?これは必要ですか?
Tropicalista

@Tropicalista:ページ自体をリロードする必要はありませんが、これは通常、認証フローが実装される方法です。
John Slegers 2014

ただし、アクセストークンの有効期限が切れている場合は、更新トークンを使用して新しいアクセストークンを取得していません。
apadana 2016

1

私はgoogle / google-api-php-client v2.0.0-RC7 で同じ問題を抱えており、1時間検索した後、次の ようにjson_encodeを使用してこの問題を解決しました

    if ($client->isAccessTokenExpired()) {
        $newToken = json_decode(json_encode($client->getAccessToken()));
        $client->refreshToken($newToken->refresh_token);
        file_put_contents(storage_path('app/client_id.txt'), json_encode($client->getAccessToken()));
    }

1

これは非常にうまく機能し、おそらく誰かを助けることができます:

index.php

session_start();

require_once __DIR__.'/client.php';

if(!isset($obj->error) && isset($_SESSION['access_token']) && $_SESSION['access_token'] && isset($obj->expires_in)) {
?>
<!DOCTYPE html>
<html>
<head>
<title>Google API Token Test</title>
<meta charset='utf-8' />
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script>
search('Music Mix 2010');
function search(q) {
    $.ajax({
        type: 'GET',
        url: 'action.php?q='+q,
        success: function(data) {
            if(data == 'refresh') location.reload();
            else $('#response').html(JSON.stringify(JSON.parse(data)));
        }
    });
}
</script>
</head>
<body>
<div id="response"></div>
</body>
</html>
<?php
}
else header('Location: '.filter_var('https://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/oauth2callback.php', FILTER_SANITIZE_URL));
?>

oauth2callback.php

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

session_start();

$client = new Google_Client();
$client->setAuthConfigFile('auth.json');
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setRedirectUri('https://'.filter_var($_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'], FILTER_SANITIZE_URL));
$client->addScope(Google_Service_YouTube::YOUTUBE_FORCE_SSL);

if(isset($_GET['code']) && $_GET['code']) {
    $client->authenticate(filter_var($_GET['code'], FILTER_SANITIZE_STRING));
    $_SESSION['access_token'] = $client->getAccessToken();
    $_SESSION['refresh_token'] = $_SESSION['access_token']['refresh_token'];
    setcookie('refresh_token', $_SESSION['refresh_token'], time()+60*60*24*180, '/', filter_var($_SERVER['HTTP_HOST'], FILTER_SANITIZE_URL), true, true);
    header('Location: '.filter_var('https://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']), FILTER_SANITIZE_URL));
    exit();
}
else header('Location: '.filter_var($client->createAuthUrl(), FILTER_SANITIZE_URL));
exit();

?>

client.php

// https://developers.google.com/api-client-library/php/start/installation
require_once __DIR__.'/vendor/autoload.php';

$client = new Google_Client();
$client->setAuthConfig('auth.json');
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->addScope(Google_Service_YouTube::YOUTUBE_FORCE_SSL);

// Delete Cookie Token
#setcookie('refresh_token', @$_SESSION['refresh_token'], time()-1, '/', filter_var($_SERVER['HTTP_HOST'], FILTER_SANITIZE_URL), true, true);

// Delete Session Token
#unset($_SESSION['refresh_token']);

if(isset($_SESSION['refresh_token']) && $_SESSION['refresh_token']) {
    $client->refreshToken($_SESSION['refresh_token']);
    $_SESSION['access_token'] = $client->getAccessToken();
}
elseif(isset($_COOKIE['refresh_token']) && $_COOKIE['refresh_token']) {
    $client->refreshToken($_COOKIE['refresh_token']);
    $_SESSION['access_token'] = $client->getAccessToken();
}

$url = 'https://www.googleapis.com/oauth2/v1/tokeninfo?access_token='.urlencode(@$_SESSION['access_token']['access_token']);
$curl_handle = curl_init();
curl_setopt($curl_handle, CURLOPT_URL, $url);
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Google API Token Test');
$json = curl_exec($curl_handle);
curl_close($curl_handle);

$obj = json_decode($json);

?>

action.php

session_start();

require_once __DIR__.'/client.php';

if(isset($obj->error)) {
    echo 'refresh';
    exit();
}
elseif(isset($_SESSION['access_token']) && $_SESSION['access_token'] && isset($obj->expires_in) && isset($_GET['q']) && !empty($_GET['q'])) {
    $client->setAccessToken($_SESSION['access_token']);
    $service = new Google_Service_YouTube($client);
    $response = $service->search->listSearch('snippet', array('q' => filter_input(INPUT_GET, 'q', FILTER_SANITIZE_SPECIAL_CHARS), 'maxResults' => '1', 'type' => 'video'));
    echo json_encode($response['modelData']);
    exit();
}
?>

1

この質問が最初に投稿されてから、Googleはいくつかの変更を加えました。

これは私の現在働いている例です。

    public function update_token($token){

    try {

        $client = new Google_Client();
        $client->setAccessType("offline"); 
        $client->setAuthConfig(APPPATH . 'vendor' . DIRECTORY_SEPARATOR . 'google' . DIRECTORY_SEPARATOR . 'client_secrets.json');  
        $client->setIncludeGrantedScopes(true); 
        $client->addScope(Google_Service_Calendar::CALENDAR); 
        $client->setAccessToken($token);

        if ($client->isAccessTokenExpired()) {
            $refresh_token = $client->getRefreshToken();
            if(!empty($refresh_token)){
                $client->fetchAccessTokenWithRefreshToken($refresh_token);      
                $token = $client->getAccessToken();
                $token['refresh_token'] = json_decode($refresh_token);
                $token = json_encode($token);
            }
        }

        return $token;

    } catch (Exception $e) { 
        $error = json_decode($e->getMessage());
        if(isset($error->error->message)){
            log_message('error', $error->error->message);
        }
    }


}

1

私はgoogle-api-php-client v2.2.2を使用しています。パラメーターfetchAccessTokenWithRefreshToken();なしのif関数呼び出しで新しいトークンを取得すると、更新されたアクセストークンが返され、更新されたトークンは失われません。

if ($client->getAccessToken() && $client->isAccessTokenExpired()) {
    $new_token=$client->fetchAccessTokenWithRefreshToken();
    $token_data = $client->verifyIdToken();
}    

1

最初の認証リクエスト時にアクセストークンをjson文字列としてファイルまたはデータベースに保存し、アクセスタイプをオフラインに設定する必要があります $client->setAccessType("offline")

次に、後続のapiリクエスト中に、ファイルまたはdbからアクセストークンを取得して、クライアントに渡します。

$accessToken = json_decode($row['token'], true);
$client->setAccessToken($accessToken);

次に、トークンの有効期限が切れているかどうかを確認する必要があります。

if ($client->isAccessTokenExpired()) {
    // access token has expired, use the refresh token to obtain a new one
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    // save the new token to file or db
    // ...json_encode($client->getAccessToken())

このfetchAccessTokenWithRefreshToken()関数はあなたに代わって作業を行い、新しいアクセストークンを提供し、それをファイルまたはデータベースに保存します。


0

Googleの認証によると、OAuth2は「invalid_grant」を返し続けます

「最初の認証が成功した後に取得したアクセストークンを再利用する必要があります。以前のトークンの有効期限がまだ切れていない場合は、invalid_grantエラーが発生します。トークンをどこかにキャッシュして再利用できます。」

それが役に立てば幸い


-1

次のコードスニペットを使用して、更新トークンを取得します

    <?php

    require_once 'src/apiClient.php';
    require_once 'src/contrib/apiTasksService.php';

    $client = new apiClient();
    $client->setAccessType('offline');
    $tasksService = new apiTasksService($client);

    $auth = $client->authenticate();
    $token = $client->getAccessToken();
    // the refresh token
    $refresh_token = $token['refresh_token'];
    ?>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.