Я много занимался отладкой и читал в Интернете, и вот мои выводы:
- access_token, который я получаю после того, как пользователь авторизовал нас через экран разрешений OAuth, действителен. Я могу использовать библиотеку Google, чтобы получить с ее помощью информацию о пользователе.
Код: Выделить всё
$oauth = new Google_Service_Oauth2($client);
$userinfo = $oauth->userinfo->get();
- Access_token проверяется нормально при использовании https://oauth2.googleapis.com/tokeninfo ... ken={token} . Я получаю полный объект, как и должно:
Код: Выделить всё
stdClass#1
(
[access_token] => '{TOKEN}'
[expires_in] => 3599
[refresh_token] => '{REFRESH_TOKEN}'
[scope] => 'https://www.googleapis.com/auth/blogger https://www.googleapis.com/auth/userinfo.profile'
[token_type] => 'Bearer'
[id_token] => '{ID_TOKEN}'
)
Однако, когда я пытаюсь запросить API Blogger V3 со своего сервера, я постоянно сталкиваюсь с ошибкой 403.
Например:
Ваш клиент не имеет
разрешения на получение URL /v3/blogs/byurl с этого сервера. Это все, что мы знаем.
Вот мой PHP-код (Yii 1) для потока OAuth2:
Начать процесс аутентификации:
Код: Выделить всё
$client = new \Google_Client();
$client->setClientId({ID});
$client->setClientSecret({SECRET});
$client->setRedirectUri({CALLBACK_URL});
$client->setAccessType('offline');
$client->setPrompt('consent');
$client->addScope([
'https://www.googleapis.com/auth/blogger',
'https://www.googleapis.com/auth/userinfo.profile',
]);
$authUrl = $client->createAuthUrl();
$this->redirect($authUrl);
Код: Выделить всё
if (!isset($_GET['code'])) {
throw new CHttpException(400, 'No code provided');
}
$client->setClientId({ID});
$client->setClientSecret({SECRET});
$client->setRedirectUri({CALLBACK_URL});
$client->setAccessType('offline');
$token = $client->fetchAccessTokenWithAuthCode($_GET['code']);
if (isset($token['error'])) {
throw new CHttpException(400, 'Google auth error: ' . $token['error_description']);
}
// For test purposes the token is just saved to session instead of DB
Yii::app()->session['google_token'] = $token;
$client->setAccessToken($token);
$oauth = new Google_Service_Oauth2($client);
// This works. An object with the user information is returned
$userinfo = $oauth->userinfo->get();
$service = new Google_Service_Blogger($client);
// this doesn't work and returns the 403 error
$blogs = $service->blogs->getByUrl([
'url'=> '{BLOG_URL}'
]);
Код: Выделить всё
$client = new \GuzzleHttp\Client();
$res = $client->get('https://www.googleapis.com/blogger/v3/users/self/blogs', [
'headers' => [
'Authorization' => 'Bearer {ACCESS_TOKEN}'
]
]);
/// returns 403
echo $res->getBody();
Кто-нибудь еще имеет такой же опыт или может предложить помощь? Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/796 ... ng-anymore
Мобильная версия