Недопустимые токены Google Access для клиента php - PullRequest
1 голос
/ 31 января 2020

Я занимаюсь разработкой сайта, доступного только через корпоративную VPN, которая использует вход в Google, который работает. Я добавляю возможность импортировать данные из Google Sheets. Я добавил необходимые области для входа в систему:

function renderButton()
{
    gapi.signin2.render('sign_in', {
        'scope': 'profile email https://www.googleapis.com/auth/spreadsheets.readonly',
        'width': 120,
        'height': 36,
        'longtitle': false,
        'theme': 'dark',
        'onsuccess': onSignIn,
        //'onfailure': onFailure
    });
}

OnSignIn хранит токен как повар ie:

function onSignIn(googleUser) {
    // Useful data for your client-side scripts:
    var profile = googleUser.getBasicProfile();

    // The ID token you need to pass to your backend:
    var id_token = googleUser.getAuthResponse().id_token;


    setCookie("Google_ID", profile.getId());
    setCookie('Full_Name', profile.getName());
    setCookie('Given_Name', profile.getGivenName());
    setCookie('Family_Name', profile.getFamilyName());
    setCookie("Image_URL", profile.getImageUrl());
    setCookie("Email", profile.getEmail()); 
    setCookie("ID_Token", id_token);

    doLogin();
}

В doLogin () я вызываю php скрипт, который выполняет клиент php (а также другие не связанные задачи):

$.post(API, {action:'test_google_client'},
function(data, status)
{
    console.log("Google result: " + data);
});

, который вызывает эту функцию php, которая использует API Google php:

function Test_Google_Client($dbh)
{
    $token = $_COOKIE["ID_Token"];

    print('Token Valid: ' . testGoogleToken($token) . '|||');
    print('Token: ' . $token . '|||');

    $client = getGoogleClient($token);

    print('Created Client |||');

    $sheets = new Google_Service_Sheets($client);
    print('Created Spreadsheet |||');

    $spreadsheetId = '<spreadsheet id>';
    $range = 'A2:M';
    $rows = $sheets->spreadsheets_values->get($spreadsheetId, $range, ['majorDimension' => 'ROWS']);

    pre($rows);
}

function getGoogleClient($token)
{
    $client = new Google_Client(['client_id' => Get_Client_ID(), 'client_secret' => Get_Client_Secrete()]);  // Specify the CLIENT_ID of the app that accesses the backend
    $client->setAccessToken($token);
    $client->addScope(Google_Service_Sheets::SPREADSHEETS_READONLY);
    //$client->setAccessType('offline');

    return $client;
}

function testGoogleToken($token)
{
    $client = new Google_Client(['client_id' => Get_Client_ID()]);  // Specify the CLIENT_ID of the app that accesses the backend
    $payload = $client->verifyIdToken($token);

    //pre($client);

    return $payload;
}

Результат, напечатанный из этой функции:

Результат Google: Token Valid: ||| Token: действительный токен доступа пропущен ||| Created Client ||| Created Spreadsheet ||| Неустранимая ошибка : Uncaught Google_Service_Exception: {"error": {"code": 401, "message": "Запрос имеет недопустимые учетные данные аутентификации. Ожидаемый токен доступа OAuth 2, логин cook ie или другая действительная аутентификация учетные данные. См. https://developers.google.com/identity/sign-in/web/devconsole-project.&quot ;, "ошибки": [{"message": "Неверные учетные данные", "домен": "глобальный", "причина": "authError", "местоположение": " Авторизация "," locationType ":" header "}]," status ":" UNAUTHENTICATED "}} в C: \ inetpub \ wwwroot \ Development \ php \ google \ src \ Google \ Http \ REST. php: 118 Трассировка стека: 0 C: \ inetpub \ wwwroot \ Development \ php \ google \ src \ Google \ Http \ REST. php (94): Google_Http_REST :: decodeHttpResponse (Объект (GuzzleHttp \ Psr7 \) Ответ), Object (GuzzleHttp \ Psr7 \ Request), 'Google_Service _...') 1 C: \ inetpub \ wwwroot \ Development \ php \ google \ src \ Google \ Task \ Runner. php (176 ): Google_Http_REST :: doExecute (Object (GuzzleHttp \ Client), Object (GuzzleHttp \ Psr7 \ Request), 'Google_Service _...') 2 C: в C: \ inetpub \ wwwroot \ Разработка \ PHP \ GOOG le \ src \ Google \ Http \ REST. php on line 118

Таким образом, по сути, verifyIdToken возвращает пустой, подразумевая, что токен недействителен, а электронная таблица выдает ошибку, говоря, что она недействительна. Чего мне не хватает, чтобы правильно проверить и использовать идентификаторы токенов?

РЕДАКТИРОВАТЬ: после просмотра дополнительных инструкций по https://theonetechnologies.com/blog/post/how-to-get-google-app-client-id-and-client-secret для установки учетных данных я получил verifyIdToken () для возврата правильного значения. Я также добавил необходимые библиотеки на консоли разработчика и добавил необходимые области для экрана согласия в консоли. Призыв к gsheets все еще возвращает ту же ошибку.

...