>백엔드 개발 >PHP 튜토리얼 >Google Analytics API로 토큰을 새로 고칠 때 'invalid_grant' 오류를 해결하는 방법은 무엇입니까?

Google Analytics API로 토큰을 새로 고칠 때 'invalid_grant' 오류를 해결하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-08 14:02:11164검색

How to Resolve

Google API 클라이언트로 토큰 새로 고침

Google Analytics API(V3)를 사용할 때 특히 검색을 시도할 때 사용자에게 오류가 발생할 수 있습니다. 테스트 계정이 아닌 다른 계정의 데이터. 이 문제는 일반적으로 403 오류로 나타납니다. 또한 토큰을 취소하고 다시 인증한 후에도 토큰 만료 시 문제가 다시 나타날 수 있습니다.

이 문제를 해결하기 위한 해결책은 RefreshToken 메서드를 활용하여 새 인증 토큰을 얻는 것입니다. 그러나 $client->refreshToken(refresh_token_key)을 실행하면 잘못된 권한 부여 오류 메시지("error": "invalid_grant")가 나타날 수 있습니다.

refreshToken 메서드 뒤에 있는 코드를 조사하면 다음과 같은 사실이 분명해집니다. 매개변수가 전송됩니다 올바르게:

  • client_id
  • client_secret
  • refresh_token
  • 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

문제 해결의 핵심은 인증 시 얻은 이 초기 토큰에 새로 고침 토큰이 있다는 점을 이해하는 것입니다. 초기 토큰은 1시간 이내에 만료되지만 새로 고침 토큰을 활용하여 새 토큰을 얻을 수 있습니다. 그러나 이 임시 토큰도 1시간 후에 만료되며 연결된 새로 고침 토큰이 없다는 점에 유의하는 것이 중요합니다. 따라서 새로운 임시 토큰을 검색하려면 초기 토큰의 새로 고침 토큰을 사용해야 합니다.

명확하게 설명하기 위해 다음 코드에서 자세한 설명을 제공합니다.

// Retrieve original 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;

$refreshToken = json_decode($token)->refresh_token;

// Initialize Google client
$client = new Google_Client();
$client->setApplicationName('');
$client->setScopes(array());
$client->setClientId('');
$client->setClientSecret('');
$client->setRedirectUri('');
$client->setAccessType('offline');
$client->setDeveloperKey('');

// Refresh token if expired
if (($timediff > 3600) && ($token != '')) {
    $refreshquery = "SELECT * FROM token WHERE type='refresh'";
    $refreshresult = mysqli_query($cxn, $refreshquery);

    // If refresh token exists
    if ($refreshresult != 0) {
        $refreshrow = mysqli_fetch_array($refreshresult);
        extract($refreshrow);
        $refresh_created = json_decode($token)->created;
        $refreshtimediff = $t - $refresh_created;

        // If refresh token is also expired
        if ($refreshtimediff > 3600) {
            $client->refreshToken($refreshToken);
            $newtoken = $client->getAccessToken();
            $tokenupdate = "UPDATE token SET token='$newtoken' WHERE type='refresh'";
            mysqli_query($cxn, $tokenupdate);
            $token = $newtoken;
            echo "refreshed again";
        } else {
            $client->setAccessToken($token);
            echo "use refreshed token but not time yet";
        }
    } else {
        $client->refreshToken($refreshToken);
        $newtoken = $client->getAccessToken();
        $tokenupdate = "INSERT INTO token (type, token) VALUES ('refresh', '$newtoken')";
        mysqli_query($cxn, $tokenupdate);
        $token = $newtoken;
        echo "refreshed for first time";
    }
}

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

$service = new Google_DfareportingService($client);

위 내용은 Google Analytics API로 토큰을 새로 고칠 때 'invalid_grant' 오류를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.