使用grant_type密码访问Google AdWords API

时间:2013-12-20 01:16:49

标签: python authentication oauth-2.0 google-adwords google-authentication

我在python中有一个调用AdWords API的服务器端应用程序。由于ClientLogin已被弃用,我将不得不使用OAuth 2.0。 基本上我需要生成访问令牌,但我不希望任何用户交互(允许访问应用程序),因为我总是在服务器上使用相同的用户名和密码,我想使用该用户名和密码进行AdWords API调用。

我认为正确的做法是通过对https://accounts.google.com/o/oauth2/token的'password'oauth2调用的grant_type。 这就是我从OAuth2.0 RFC(http://tools.ietf.org/html/rfc6749#page-38)中理解的内容。 RFC表示请求/查询字符串必须包含3个参数:grant_type(设置为'password'),用户名和密码。

所以我构建了我的curl脚本,看起来像:

curl -v --data "grant_type=password&username=user@gmail.com&password=password" https://accounts.google.com/o/oauth2/token

但是我启动了这个命令,然后我回复了谷歌的回复:

{"error" : "invalid_request"}

我错过了什么吗?是否有一个简单的python库支持grant_type = password,并且有足够的文档?

1 个答案:

答案 0 :(得分:2)

AdWords API不支持此授权类型,因此您无法使用用户名和密码获取访问令牌,但您可以使用刷新令牌获取访问令牌。您的应用程序只需存储刷新令牌并使用它来从OAuth API获取新的访问令牌。您只需要授权帐户并获取一次代码;将代码输入示例后,您将获得访问权限并刷新令牌。

以下是该过程的概述:

1:构建授权网址:

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:浏览到该网址并授权您的帐户。

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