#php #google-photos #google-photos-api
#php #google-photos #google-photos-api
Вопрос:
Я создаю приложение, используя Google photos api на php. Вот мой код
function connectWithGooglePhotos()
{
$clientSecretJson = json_decode(
file_get_contents('credentials.json'),
true
)['web'];
$clientId = $clientSecretJson['client_id'];
$clientSecret = $clientSecretJson['client_secret'];
$tokenUri = $clientSecretJson['token_uri'];
$redirectUri = $clientSecretJson['redirect_uris'][0];
$scopes = ['https://www.googleapis.com/auth/photoslibrary'];
$oauth2 = new OAuth2([
'clientId' => $clientId,
'clientSecret' => $clientSecret,
'authorizationUri' => 'https://accounts.google.com/o/oauth2/v2/auth',
'redirectUri' => $redirectUri,
'tokenCredentialUri' => 'https://www.googleapis.com/oauth2/v4/token',
'scope' => $scopes,
]);
// The authorization URI will, upon redirecting, return a parameter called code.
if (!isset($_GET['code'])) {
$authenticationUrl = $oauth2->buildFullAuthorizationUri(['access_type' => 'offline']);
header('Location: ' . $authenticationUrl);
} else {
// With the code returned by the OAuth flow, we can retrieve the refresh token.
$oauth2->setCode($_GET['code']);
$authToken = $oauth2->fetchAuthToken();
$refreshToken = $authToken['access_token'];
// The UserRefreshCredentials will use the refresh token to 'refresh' the credentials when
// they expire.
$_SESSION['credentials'] = new UserRefreshCredentials(
$scopes,
[
'client_id' => $clientId,
'client_secret' => $clientSecret,
'refreshToken' => $refreshToken,
]
);
$photosLibraryClient = new PhotosLibraryClient(['credentials' => $_SESSION['credentials']]);
}
return $photosLibraryClient;
}
Вот ошибка при перенаправлении на аутентификацию
Неустранимая ошибка: неперехваченный InvalidArgumentException: ключу json не хватает поля refresh_token в C:xampphtdocsgphotosvendorgoogleauthsrcCredentialsUserRefreshCredentials.php:78 Трассировка стека: #0 C:xampphtdocsgphotosconfig.php (49): GoogleAuthУчетные данные UserRefreshCredentials->__построить(массив, Массив) #1 C:xampphtdocsgphotosindex.php (5): Добавлено connectWithGooglePhotos() #2 {main} C:xampphtdocsgphotosvendorgoogleauthsrcCredentialsUserRefreshCredentials.phpв строке 78
Любые решения будут оценены!
Комментарии:
1. Робин, проверь мой ответ. Дайте мне знать, если у вас все еще возникнут какие-либо проблемы
Ответ №1:
'refreshToken'
должно быть 'refresh_token'
, потому что ключ для токена обновления refresh_token
поэтому вам необходимо изменить свои учетные данные на
[
'client_id' => $clientId,
'client_secret' => $clientSecret,
'refresh_token' => $refreshToken,
]
Комментарии:
1. Даниал, не могли бы вы еще раз проверить код и сказать мне, почему токен обновления не работает. Срок его действия истекает через 1 час и показывает мне ошибку, например, токен отозван
2. какое исключение вы получаете?
3. Теперь я не на своем компьютере, но он сказал, что срок действия вашего токена истек или отозван
4. { «ошибка»: «invalid_grant», «error_description»: «срок действия токена истек или он отозван». }
5. это означает, что срок действия токена обновления истек. Вам необходимо его восстановить
Ответ №2:
Убедитесь, что для параметра «приглашение» установлено значение «согласие», как показано ниже.
$url = $oauth2->buildFullAuthorizationUri([
'prompt' => 'consent',
'access_type' => 'offline'
]);
Обычно токен обновления возвращается только при первом вызове приглашения. Это сделано специально.
Однако, если вам нужно снова получить принудительное согласие, используйте вышеуказанную настройку. Это также приведет к повторной генерации токена обновления.