0

У меня есть приложение на стороне сервера в python, которое вызывает API AdWords. Поскольку ClientLogin устарел, мне придется использовать OAuth 2.0. В основном мне нужно создать токен доступа, но я не хочу, чтобы какое-либо взаимодействие с пользователем (чтобы разрешить доступ к приложению), потому что я всегда использую то же имя пользователя и пароль на сервере, и я бы хотел использовать это имя пользователя и пароль для вызова API API.Доступ к API Google AdWords с паролем типа grant_type

Я считаю, что правильный способ сделать это через grant_type 'password' oauth2 call to https://accounts.google.com/o/oauth2/token. И это то, что я понял из OAuth2.0 RFC (http://tools.ietf.org/html/rfc6749#page-38). В RFC говорится, что строка запроса/запроса должна содержать 3 параметра: grant_type (установлен на «пароль»), имя пользователя и пароль.

Так я построил мой локон скрипт, который выглядит как:

curl -v --data "grant_type=password&[email protected]&password=password" https://accounts.google.com/o/oauth2/token 

Но я запускаю команду и я вернусь с ответом от Google:

{"error" : "invalid_request"} 

ли я что-то отсутствует? Есть ли простая библиотека python, которая поддерживает grant_type = password и имеет достаточно хорошую документацию?

ответ

2

Этот тип гранта не поддерживается API AdWords, поэтому вы не можете получить токен доступа с использованием имени пользователя и пароля, но вы можете получить его с помощью токена обновления. Вашему приложению просто нужно сохранить токен обновления и использовать его для получения новых токенов доступа из API OAuth. Вам нужно только авторизовать учетную запись и получить код один раз; после ввода кода в пример, вы получите токен доступа и обновления.

Вот набросок процесса:

1: Построить URL авторизации:

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=1234567890123.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://adwords.google.com/api/adwords/&access_type=offline

Обратите внимание на access_type из offline который запрашивает обновления маркера, который можно использовать для создания новые токены доступа, когда они истекают.

2: Просмотрите URL-адрес и авторизуйте свою учетную запись.

3: Распакуйте code со страницы переадресации, и запрашивающие доступ и обновление лексемы:

curl -v --data "code=4/v6xr77ewYqhvHSyW6UJ1w7jKwAzu&client_id=8819981768.apps.googleusercontent.com&client_secret={client_secret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token

Это должно вернуть вам доступ и обновить маркеры:

{ 
    "access_token":"1/fFAGRNJru1FTz70BzhT3Zg", 
    "expires_in":3920, 
    "token_type":"Bearer", 
    "refresh_token":"1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI" 
} 

4: токен доступа длится всего один час, но вы можете использовать токен обновления для генерации нового без повторения шагов 1-3.:

curl -v --data "client_id=8819981768.apps.googleusercontent.com& client_secret={client_secret}&refresh_token=1/xEoDL4iW3cxlI7yDbSRFYNG01kVKM2C-259HOF2aQbI& grant_type=refresh_token" https://accounts.google.com/o/oauth2/token

Вы можете найти Python-specific example here.

+0

Правильно, но с типом grantization_code я перенаправляю пользователя к URL-адресу auth, где они могут принимать/разрешать приложению доступ к своей учетной записи, а затем им нужно будет скопировать и вставить параметр запроса кода в URL-адрес перенаправления они получили от google (код уведомления = raw_input («Код:») в примере). В любом случае я могу сделать это за кулисами без какого-либо взаимодействия с пользователем? В моем случае нет пользователя, и это только я, у меня есть имя пользователя и пароль, которые я могу использовать, единственное, что мне нужно сделать, это получить токен доступа (используя мое собственное имя пользователя и пароль) и вызвать API – Marc

+0

I ' отредактировал ответ. Теперь это имеет смысл? –

+0

Я считаю, что это то, что я ищу, но вместо того, чтобы писать собственный клиент, я буду использовать модуль python OAuth2Credentials, который выполняет большинство вызовов http. Я думаю, что трюк состоял в том, что я должен сделать это только один раз, чтобы получить учетные данные, и я могу сохранить эти учетные данные навсегда, а затем использовать их для получения/обновления токенов доступа. Спасибо, ваш ответ на месте! – Marc

Смежные вопросы