【问题标题】:Google AdWords API access w/ grant_type password使用 grant_type 密码访问 Google AdWords API
【发布时间】:2014-01-08 18:58:36
【问题描述】:

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

我相信正确的方法是通过grant_type 'password' oauth2 调用https://accounts.google.com/o/oauth2/token。 这就是我从 OAuth2.0 RFC (https://www.rfc-editor.org/rfc/rfc6749#page-38) 中了解到的。 RFC 规定请求/查询字符串必须包含 3 个参数:grant_type(设置为“密码”)、用户名和密码。

所以我构建了我的 curl 脚本,如下所示:

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

但是我启动了命令,然后我得到了来自 google 的响应:

{"error" : "invalid_request"}

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

【问题讨论】:

    标签: python authentication oauth-2.0 google-ads-api google-authentication


    【解决方案1】:

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

    以下是该过程的概要:

    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

    注意offline 中的access_type 请求刷新令牌,您可以在它们过期时使用它来生成新的访问令牌。

    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

    【讨论】:

    • 对,但是使用授权类型的授权代码,我将用户重定向到他们可以接受/允许应用程序访问其帐户的身份验证 URL,然后他们需要复制并粘贴代码查询他们从 google 收到的重定向 url 中的参数(示例中的通知 code = raw_input('Code: '))。无论如何我可以在没有任何用户交互的情况下在幕后做到这一点?就我而言,没有用户,只有我自己,我有一个可以使用的用户名和密码,我唯一需要做的就是获取访问令牌(使用我自己的用户名和密码)并调用 API
    • 我已经编辑了答案。现在更有意义了吗?
    • 我相信这是我正在寻找的东西,但我不会编写自己的客户端,而是使用 OAuth2Credentials python 模块来执行大部分 http 调用。我认为诀窍是我应该只执行一次以获取凭据,并且我可以永久保存这些凭据,然后使用它们来获取/刷新访问令牌。谢谢,你的答案是正确的!
    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 2014-02-01
    • 2012-08-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多