Получение токена авторизации AdWords без клиентской библиотеки

2,283 views
Skip to first unread message

sneus...@treto.ru

unread,
Dec 23, 2014, 9:51:57 AM12/23/14
to adwor...@googlegroups.com
Доброго времени суток!
Может кто-то сталкивался, как можно получить токен авторизации без использования клиентской библиотеки, как тут https://developers.google.com/adwords/api/docs/guides/authentication?hl=ru . Т.е. есть ли отличный от описаного по ссылке метод получения этого токена авторизации?

П,С, при посылке HTTP-запроса получаю ошибку вида "AuthenticationError.OAUTH_TOKEN_INVALID"

Буду признателен за ответы!

Danial Klimkin

unread,
Dec 24, 2014, 5:28:59 AM12/24/14
to adwor...@googlegroups.com
Добрый день,


Без библиотек, процесс описан здесь:



-Даниил, команда AdWords API.

tret...@gmail.com

unread,
Dec 24, 2014, 6:48:47 AM12/24/14
to adwor...@googlegroups.com
Спасибо!
Пытаюсь отправить запрос вида:
POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
redirect_uri=https://oauth2-login-demo.appspot.com/code&
grant_type=authorization_code
Получаю ошибку 404:
{
 "error": "invalid_request",
 "error_description": "Required parameter is missing: grant_type"
}
 Ошибка доступа к ресурсу. Путь не найден:  '/oauth2/v3/token'


среда, 24 декабря 2014 г., 12:28:59 UTC+2 пользователь Danial Klimkin написал:

sneus...@treto.ru

unread,
Dec 25, 2014, 2:29:39 AM12/25/14
to adwor...@googlegroups.com
Посылаю запрос:
POST /oauth2/v3/token HTTP/1.1
Host: 
ссылка
Content-length: 297
Content-type: application/x-www-form-urlencoded'
Authorization: Bearer

grant_type=authorization_code&
code=4/i6TpcMwelL81Hk-EZgsE9NTaEyxrR84lygze2Ig-F3A.AiphZauHhU8eYFZr95uygvWRnlL5lAI&
client_id=260377337994-n2pn193ne3li1ko4rgjfim0lni37svq8.apps.googleusercontent.com&
client_secret=uteV8rw9T2E5O4p2JyMslRc5&
redirect_uri=https://developers.google.com/oauthplayground

получаю ошибку:

"error_description": "Missing required parameter: code", 
"error": "invalid_request" 
}

А если запрос:
POST /oauth2/v3/token HTTP/1.1
Host: 
ссылка
Content-length: 297
Content-type: application/x-www-form-urlencoded'
Authorization: Bearer

code=4/i6TpcMwelL81Hk-EZgsE9NTaEyxrR84lygze2Ig-F3A.AiphZauHhU8eYFZr95uygvWRnlL5lAI&
client_id=260377337994-n2pn193ne3li1ko4rgjfim0lni37svq8.apps.googleusercontent.com&
client_secret=uteV8rw9T2E5O4p2JyMslRc5&
redirect_uri=https://developers.google.com/oauthplayground
&
grant_type=authorization_code

Тогда ошибка:
{
"error_description": "Required parameter is missing: grant_type",
"error": "invalid_request"

Как можно ее решить? Уже все перепробовал...

среда, 24 декабря 2014 г., 12:28:59 UTC+2 пользователь Danial Klimkin написал:
Добрый день,

Danial Klimkin

unread,
Dec 25, 2014, 5:24:11 AM12/25/14
to adwor...@googlegroups.com
В первую очередь, надо удалить данный OAuth клиент и создать новый. ClientSecret не должен быть никому известен, а это публичный форум.

1. Создайте новый клиент с типом "installed application".

2. Получение verification code. Для этого в браузере откройте ссылку:

https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=YOUR_CLINET_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/adwords


(нужно заполнить client ID)

3. Получение refresh token. Можно с помощью curl:

curl -s -d code=AUTHORIZATION_CODE -d grant_type=authorization_code -d \

client_id=YOUR_CLIENT_ID -d client_secret=YOUR_CLIENT_SECRET \

-d redirect_uri=urn:ietf:wg:oauth:2.0:oob \

(нужно заполнить все поля)

4. Обновление access token:

curl -s -d refresh_token=YOUR_REFRESH_TOKEN -d grant_type=refresh_token \

-d client_id=YOUR_CLIENT_ID -d client_secret=YOUR_CLIENT_SECRET \

https://accounts.google.com/o/oauth2/token



-Даниил.

sneus...@treto.ru

unread,
Dec 25, 2014, 5:38:26 AM12/25/14
to adwor...@googlegroups.com
Получил ответ когда послал запрос с текстом:
&grant_type=authorization_code&client_secret=uteV8rw9T2E5O4p2JyMslRc5&redirect_uri=urn:ietf:wg:oauth:2.0:oob&client_id=260377337994-n2pn193ne3li1ko4rgjfim0lni37svq8.apps.googleusercontent.com&code=4/XM7FiGwgWf6SLDrEo2ivsp6H-AGM9rC8id42WuJCgjY.Ql0TPHPBSnwUYFZr95uygvVbQ_8BlQI
Ответ вида:

"access_token": "ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ", 
"token_type": "Bearer", 
"expires_in": 3600, 
"refresh_token": "ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ", 
"id_token": "ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ" 
}


четверг, 25 декабря 2014 г., 12:24:11 UTC+2 пользователь Danial Klimkin написал:

sneus...@treto.ru

unread,
Dec 25, 2014, 6:14:41 AM12/25/14
to adwor...@googlegroups.com
Вопрос теперь как использовать полученные параметры?
"access_token" посылать в <soapenv:Header>?
"refresh_token" - его где использовать?

четверг, 25 декабря 2014 г., 12:38:26 UTC+2 пользователь sneus...@treto.ru написал:

Danial Klimkin

unread,
Dec 25, 2014, 6:41:52 AM12/25/14
to adwor...@googlegroups.com
Это как раз описано здесь:


лучше смотреть английскую версию.

refresh token используется для получения access token (шаг 4 в моем ответе ниже).

access token используется в каждом запросе, в HTTP headers как описано здесь:



-Danial, AdWords API Team.

sneus...@treto.ru

unread,
Dec 25, 2014, 7:13:49 AM12/25/14
to adwor...@googlegroups.com
Я по этому описанию и делаю...
добавляю в HTTP request header Authorization: Bearer THE_ACCESS_TOKEN
Далее отправляю:
<soapenv:Header>
   
<ns1:RequestHeader soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0" xmlns:ns1="https://adwords.google.com/api/adwords/cm/v201402">
     
<ns1:clientCustomerId>xxx-xxx-xxxx</ns1:clientCustomerId>
     
<ns1:developerToken>ВАШ_ТОКЕН_РАЗРАБОТЧИКА</ns1:developerToken>
     
<ns1:userAgent>НАЗВАНИЕ_ВАШЕГО_ПРИЛОЖЕНИЯ</ns1:userAgent>
     
<ns1:validateOnly>false</ns1:validateOnly>
     
<ns1:partialFailure>false</ns1:partialFailure>
   
</ns1:RequestHeader>
 
</soapenv:Header>
В итоге получаю - OAUTH_TOKEN_INVALID

четверг, 25 декабря 2014 г., 13:41:52 UTC+2 пользователь Danial Klimkin написал:

Danial Klimkin

unread,
Dec 25, 2014, 8:35:40 AM12/25/14
to adwor...@googlegroups.com
Ну, во-первых, версия v201402 уже не доступна:


Убедитесь что подствляете access token, а не refresh token. Так же, access token действителен только 1 час после получения, через час нужно получать новый используюя refresh token.


-Даниил.

sneus...@treto.ru

unread,
Dec 25, 2014, 8:37:53 AM12/25/14
to adwor...@googlegroups.com
То в примере v201402 , я пользуюсь v201409.
Нет токены не перепутал

четверг, 25 декабря 2014 г., 15:35:40 UTC+2 пользователь Danial Klimkin написал:

sneus...@treto.ru

unread,
Dec 25, 2014, 9:01:17 AM12/25/14
to adwor...@googlegroups.com
Не подскажите, access token имеет какой-то срок действия, не нужно ли его каждый раз при подключении получать?
Т.е. если я обращаюсь к веб-сервису, то перед этим не нужно ли каждый раз пролучать access token, а уже потом выполнять метод веб-сервиса?

четверг, 25 декабря 2014 г., 15:35:40 UTC+2 пользователь Danial Klimkin написал:

Danial Klimkin

unread,
Dec 26, 2014, 5:15:18 AM12/26/14
to adwor...@googlegroups.com
Как я указал выше: "access token действителен только 1 час после получения, через час нужно получать новый используюя refresh token."


-Даниил.

sneus...@treto.ru

unread,
Dec 26, 2014, 6:14:48 AM12/26/14
to adwor...@googlegroups.com
Спасибо.
Я уже вчера нашел это, делаю через refresh_token.
Правильно ли то что я делаю: 
1. я перед каждым запросом к методу "get()" веб-сервиса "adwords.google.com/api/adwords/o/v201409/TrafficEstimatorService" делаю запрос вида:
POST /oauth2/v3/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

client_id=8819981768.apps.googleusercontent.com&
client_secret={client_secret}&
refresh_token=1/6BMfW9j53gdGImsiyUH5kU5RsR4zwI9lUVX-tqf8JXQ&
grant_type=refresh_token
в ответ получаю :
{
 "access_token": "ya29.ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ",
 "token_type": "Bearer",
 "expires_in": 3600,
 "id_token": "ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ"
}

2. Делаю запрос к веб серввису "adwords.google.com/api/adwords/o/v201409/TrafficEstimatorService" вида:
POST /api/adwords/o/v201409/TrafficEstimatorService HTTP/1.1
Host: adwords.google.com
Authorization: Bearer Указываю_полученный_выше_access_token
Content-Type: text/xml;charset=UTF-8
Content-Length:

<?xml version="1.0"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope">
 

</soap:Envelope>
В итоге(в ответе) получаю ошибку "OAUTH_TOKEN_INVALID".
Не подскажите  в чем причина, или можеть натолкните на какие-то еще мысли?
Спасибо!

пятница, 26 декабря 2014 г., 12:15:18 UTC+2 пользователь Danial Klimkin написал:

Danial Klimkin

unread,
Dec 26, 2014, 7:42:43 AM12/26/14
to adwor...@googlegroups.com
Как выглядел запрос на refresh token? Скорее всего, был указан неверный scope.



-Даниил.

sneus...@treto.ru

unread,
Dec 26, 2014, 7:53:47 AM12/26/14
to adwor...@googlegroups.com
Текст запроса на получение access_token:

&grant_type=refresh_token&
client_secret=ХХХХХХХХХХХХХХХХХХХХ&
refresh_token=ХХХХХХХХХХХХХХХХХХХХХХХХХХХХХ

Для получения  refresh token:

state=security_token%3D138r5719ru3e1%26url%3Dhttps://oa2cb.example.com/myHome&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
response_type=code&
access_type=offline

пятница, 26 декабря 2014 г., 14:42:43 UTC+2 пользователь Danial Klimkin написал:

Danial Klimkin

unread,
Dec 26, 2014, 8:54:46 AM12/26/14
to adwor...@googlegroups.com
У вас неверный scope. Должен быть:



-Даниил.

sneus...@treto.ru

unread,
Dec 26, 2014, 9:00:16 AM12/26/14
to adwor...@googlegroups.com
Спасибо! попробую!
Нужно мне проделать все заново и получить новый refresh_token?
Кстати какой срок действия refresh_token? Просто мне нужно один раз разрешить приложению доступ, а потом чтоб все было в автомате, без ручного вмешательства...

пятница, 26 декабря 2014 г., 15:54:46 UTC+2 пользователь Danial Klimkin написал:

Danial Klimkin

unread,
Dec 29, 2014, 7:32:44 AM12/29/14
to adwor...@googlegroups.com
Да, с самого начала, с verification code.

Refresh token действует неограничено, но его можно отозвать в настройках.


-Даниил.

sneus...@treto.ru

unread,
Dec 29, 2014, 8:53:21 AM12/29/14
to adwor...@googlegroups.com
Спасибо большое за помощь!

понедельник, 29 декабря 2014 г., 14:32:44 UTC+2 пользователь Danial Klimkin написал:

sneus...@treto.ru

unread,
Dec 29, 2014, 10:44:44 AM12/29/14
to adwor...@googlegroups.com
У меня проблема такого характера:
Я получил refresh_token под тестовым аккаутом, добавли его в центре клиентов, пытаюсь выполинть запрос к веб-сервису TrafficEstimatorService но в ответе смущает строка:

<ns2:serviceName>CampaignService</ns2:serviceName>

такое чувство что идет запрос к веб-сервису CampaignService, я прав?
Обращаюсь к серверу : adwords.google.com
И к ресурсу                 : /api/adwords/o/v201409/TrafficEstimatorService


понедельник, 29 декабря 2014 г., 14:32:44 UTC+2 пользователь Danial Klimkin написал:

Danial Klimkin

unread,
Dec 30, 2014, 5:36:49 AM12/30/14
to adwor...@googlegroups.com
Пожалуйста, создавайте отдельные топики для несвязанных вопросов.


По TIS / TES, это известная проблема, поле serviceName для TIS и TES может возвращаться неверно. Это никак не влияет на функциональность.

Так же, данные TIS / TES для тестовых аккаунтов возвращаются тоже тестовые, а не реальные.


-Даниил.

sneus...@treto.ru

unread,
Dec 30, 2014, 6:45:48 AM12/30/14
to adwor...@googlegroups.com
Хорошу буду создавать отдельную тему в след. раз.
Последний вопрос, если я создал рефреш токен через тестовый аккаунт,  поулчаю по нему акцес токен, то при обращении к TrafficEstimatorService буду получать тестовые данные, не реальные?

вторник, 30 декабря 2014 г., 12:36:49 UTC+2 пользователь Danial Klimkin написал:

Danial Klimkin

unread,
Dec 30, 2014, 9:47:04 AM12/30/14
to adwor...@googlegroups.com
Да, если используется clientCustomerId тестового аккаунта.


-Даниил.

sneus...@treto.ru

unread,
Dec 30, 2014, 10:07:21 AM12/30/14
to adwor...@googlegroups.com
Хм...ну у меня clientCustomerId под тестовым и владельцем центра клиентов одинаковый, это же он в правом верхнем углу: Идентификатор клиента: ххх-ххх-хххх ?

вторник, 30 декабря 2014 г., 16:47:04 UTC+2 пользователь Danial Klimkin написал:

Danial Klimkin

unread,
Dec 30, 2014, 2:29:00 PM12/30/14
to adwor...@googlegroups.com
Статус тестовый / рабочий относится к аккаунту в целом, но не к пользователю.



-Danial, AdWords API Team.
Reply all
Reply to author
Forward
0 new messages