Я использую API Google Analytics v3. Я объясню поток моего приложения сейчас.
Я использовал эту документацию здесь: https://developers.google.com/accounts/docs/OAuth2WebServer
Во-первых, для пользователя создается URL-адрес OAUTH. URL-адрес выглядит следующим образом:
https://accounts.google.com/o/oauth2/auth? client_id={CLIENT-ID}& redirect_uri={REDIRECT-URL}& state={CUSTOM-NUMBER}& response_type=code& access_type=offline& approval_prompt=force& scope=https://www.googleapis.com/auth/analytics
Когда пользователь нажимает на ссылку, он аутентифицируется. Впоследствии, с кодом, я получаю токен доступа и обновления.
Я отправляю запрос на https://www.googleapis.com/oauth2/v3/token
с параметрами
code = Code from Analytics grant_type = authorization_code client_secret = CLIENT_SECRET client_id = CLIENT_ID redirect_uri = REDIRECT_URI
Параметры cURL, которые я отправляю, следующие:
CURLOPT_HTTPHEADER = array('Content-Type: application/x-www-form-urlencoded')
И, конечно, почтовые данные создаются с помощью http_build_query, поэтому я могу использовать этот заголовок типа контента.
Затем я получаю все профили пользователя, с этим URL-адресом
https://www.googleapis.com/analytics/v3/management/accounts/~all/webproperties/~all/profiles
Это работает, и я перечисляю все профили. Затем пользователь выбирает один из профилей, и моя библиотека получает текущие данные для пользователя (просмотры страниц, посещения и т. Д.),
Проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда я хочу обновлять данные каждый день с помощью cron, я получаю сообщение об ошибке:
'error' => 'invalid_grant', 'error_description' => 'Bad Request'
Но я понятия не имею, почему?
Я сохранил токен доступа и токен обновления для профилей в моей базе данных. Затем, когда я повторно обрабатываю данные до того, как я сделаю запросы на доступ к данным, я проверю, действительно ли токен. Но даже это не удается.
Я делаю этот запрос здесь
https://accounts.google.com/o/oauth2/tokeninfo?access_token=ya29.BwHqH8NOPVhafk3SnwbqjLZMXub4Q8bemC-8vKVwp-UjRqaIHRXrzEV3WjInhGzl1-phIn7XI4NnDA
Он говорит мне, что токен доступа неверен (что является загадочным, так как я просто аутентифицирован и через 5 секунд токен уже недействителен?
В любом случае, я пытаюсь обновить его с помощью этого запроса
URL: https://www.googleapis.com/oauth2/v3/token Parameters: client_secret = CLIENT_SECRET client_id = CLIENT_ID refresh_token = REFRESH_TOKEN From my database grant_type = refresh_token cURL Options: CURLOPT_HTTPHEADER = array('Content-Type: application/x-www-form-urlencoded')
Затем, почтовый запрос с параметрами, созданными с помощью http_build_query
Ответ выглядит так:
string(67) "{ "error": "invalid_grant", "error_description": "Bad Request" } "
Но я понятия не имею, почему. Я использую токен доступа и обновляю токен, который у меня есть на 5 минут раньше, и те, которые работали для первого запроса. Почему он не работает через 5 минут с теми же жетонами? И почему я не могу обновить токен?
Недопустимый грант обычно имеет две возможные причины.
Вы должны хранить токен Refresh. Ток доступа истекает через час. Здесь идет прогулка, хотя на разных вызовах Google 3-х точечный поток Oauth2 .
Я не мог ничего понять из вашего кода, он выглядел немного запутанным. Но я не мог видеть ничего, что действительно выглядело неправильно, поэтому я предполагаю, что это может быть один из первых двух вопросов.
Я знаю, что этот вопрос устарел, но у меня была эта проблема из-за косой черты ( /
) код иногда имеет и не расшифровывает его правильно при извлечении из URL-адреса перенаправления.
Так что токен, как 4/BGrvsJeuc5BoRRN ...
пошел на моем сервере, как 4%2FBGrvsJeuc5BoRRN ...
Проводя это, если кто-то другой будет таким же глупым, как я.