Я занимаюсь разработкой сайта, доступного только через корпоративную 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." ;, "ошибки": [{"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 все еще возвращает ту же ошибку.