Моя первая проблема заключается в том, что когда я делаю экземпляр Google_Client
и устанавливаю все необходимые scopes
, configs
, access types
и others
, а затем генерирую URL-адрес для пользователя AUTH с $client->createAuthUrl();
Я разрешаю доступ к своему приложению с помощью учетной записи Google, в которую я вошел.Все работает нормально, пока мне не нужно обновить токен.
Я объясняю ниже об обновлении токена.
$this->client = new Google_Client();
$this->client->setAuthConfig(Storage::path('secret.json'));
$this->client->setAccessType("offline"); // offline access
$this->client->setIncludeGrantedScopes(true); // incremental auth
$this->client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY);
$this->client->setRedirectUri(env('APP_URL') . '/login/google/callback');
Итак, следующее, что я сделал, это получил данные пользователя Google с помощью laravel-socialite.
Это данныеЯ получаю:
Код для запроса
public function redirectToGoogleProvider()
{
$parameters = ['access_type' => 'offline'];
return Socialite::driver('google')
->scopes(["https://www.googleapis.com/auth/drive"])
->with($parameters)
->redirect();
}
User {#466 ▼
+token: "ya29.GmPhBiSuYJ_oKsvDTUXrj3lJR5jlEYV4x8d0ZuYZLnDJgYL-uePT_KuUkIb-OQUiWBElhm6ljfac5QhDTXYK3qjWjje1vsnZsTAJ7pXyjNAVd2buZy0a6xZCTdnLdFNMKMDMXa6bGbA"
+refreshToken: null
+expiresIn: 3599
+id: "101509757451285102354"
+nickname: null
+name: "My name"
+email: "My email"
+avatar: "https://lh3.googleusercontent.com/-Qsbr3VmcZ50/AAAAAAAAAAI/AAAAAAAAAAA/ACHi3rdS2HIl3LCv5EYCmvyXulG8n-Ap7w/mo/photo.jpg"
+user: array:12 [▶]
+"avatar_original": "https://lh3.googleusercontent.com/-Qsbr3VmcZ50/AAAAAAAAAAI/AAAAAAAAAAA/ACHi3rdS2HIl3LCv5EYCmvyXulG8n-Ap7w/mo/photo.jpg"
}
Здесь нет токена обновления.Я предполагаю, что это связано с тем, что Google работает в автономном режиме
После того, как пользователь предоставил автономный доступ к запрошенным областям, вы можете продолжать использовать клиент API длядоступ к API Google от имени пользователя, когда пользователь находится в автономном режиме.Клиентский объект будет обновлять токен доступа по мере необходимости.
Поэтому я установил токен, полученный из запроса и сохраняющий в базе данных, к экземпляру Google_Client
с
$client->setAccessToken(Auth::user()->getUserInfo()->refresh_token)
Это работает.Но когда токен нужно обновить, он не обновляется.Вместо этого я получаю
"Недопустимая ошибка creditianals".
Google говорит, что:
"Клиентский объект обновит доступжетон по мере необходимости. "Но этого не происходит.
Я не понимаю, нужно ли мне вызывать специальный метод или как Google_Client
обрабатывает обновление токена.
Я пыталсяиспользуйте CODE parameter
для получения токена и обновления токена вместе с ним.
$client->fetchAccessTokenWithAuthCode($code);
И получил эту ошибку:
array:2 [▼
"error" => "invalid_request"
"error_description" => "Could not determine client ID from request."
]
Возможно, я что-то не так делаю, но понятия не имею, что.Я смущен, если честно.Уже потерял день без успеха.