【问题标题】:How to get oauth2-token for Google Analytics Reporting API (REST method) in Python如何在 Python 中为 Google Analytics Reporting API(REST 方法)获取 oauth2-token
【发布时间】:2019-07-20 01:23:38
【问题描述】:

我想通过仅接受 REST 端点的网关路由我的 Google Analytics Reporting API 请求(代码将在 AWS Lambda 中)。由于在与网关的交互中无法使用 Client 封装方法,因此我需要将 API 作为 REST-ful 端点进行查询。

官方文档是这么说的(Link):

Authorization: Bearer {oauth2-token}

GET https://www.googleapis.com/analytics/v3/data/ga
  ?ids=ga:12345
  &start-date=2008-10-01
  &end-date=2008-10-31
  &metrics=ga:sessions,ga:bounces

我不知道在 Python 中创建 oauth2-token。我创建了一个服务帐户并拥有包含客户端 ID 和密钥的 secrets_json。 然后这个link 中给出的客户端包方法起作用。但我只需要 Rest 方法!

使用这些,我如何创建 oauth2-token ?

【问题讨论】:

  • 如果您要使用服务帐户,我建议您使用客户端库。如果你不能,那么我建议你试着把它拆开客户端库并找到他们正在使用的代码。这也可能会有所帮助developers.google.com/identity/protocols/OAuth2ServiceAccount祝你好运。服务帐号认证不是像oauth2这样简单的东西
  • @DaImTo 如果我不使用服务帐户还有其他方式吗?
  • 使用 Oauth2 并对其进行一次身份验证并保存刷新令牌并在需要新访问令牌时使用它
  • @DaImTo 我明白,但我该怎么做呢?你能提供一个示例代码吗?这是脚本的一部分,意思是使过程自动化。所以没有手动用户身份验证。

标签: python google-analytics google-api google-oauth google-api-python-client


【解决方案1】:

您可以为此使用 Oauth2,我过去曾这样做过,但您需要对其进行监控。您将需要授权此代码一次并保存刷新令牌。刷新令牌的寿命很长,它们通常不会过期,但如果确实如此,您的代码应该能够与您联系,以便您可以再次对其进行授权。如果您保存刷新令牌,您可以随时使用最后一步请求新的访问令牌。

Oauth2 基本上由三个调用组成。我可以给你 HTTP 调用,我会让你计算出 Python Google 3 Legged OAuth2 Flow

身份验证和授权

您需要的第一件事是用户的许可。为此,您在授权服务器上建立了一个链接。这是一个 HTTP 获取请求,您可以将其放在普通浏览器窗口中进行测试。

GET https://accounts.google.com/o/oauth2/auth?client_id={clientid}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/analytics.readonly&response_type=code

关于重定向 uri 的注意事项。如果您在服务器或其他东西上运行它,那么使用urn:ietf:wg:oauth:2.0:oob 它基本上告诉服务器将代码返回到它来自其他方面的地方,如果您在网站上进行冲洗,您可以为将要处理的页面提供一个 url回应。

如果用户接受上述内容,那么您将获得一个授权码。

兑换码

接下来需要交换上述响应返回的授权码,并请求访问令牌和刷新令牌。这是一个 http post call

POST https://accounts.google.com/o/oauth2/token
code=4/X9lG6uWd8-MMJPElWggHZRzyFKtp.QubAT_P-GEwePvB8fYmgkJzntDnaiAI&client_id={ClientId}&client_secret={ClientSecret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code

body 参数应该和我显示的一样,用 & 分隔,请求的内容类型是application/x-www-form-urlencoded

回复

{
"access_token" : "ya29.1.AADtN_VSBMC2Ga2lhxsTKjVQ_ROco8VbD6h01aj4PcKHLm6qvHbNtn-_BIzXMw",
"token_type" : "Bearer",
"expires_in" : 3600,
"refresh_token" : "1/J-3zPA8XR1o_cXebV9sDKn_f5MTqaFhKFxH-3PUPiJ4"
}

访问令牌可用于您对 api 的所有请求,方法是在访问令牌中添加授权标头不记名令牌,或在请求中发送 access_token= 作为参数。

刷新访问令牌

刷新令牌的寿命很长,它们不应该过期,因此您的代码应该能够处理它,但通常它们永远是好的。访问令牌仅在一小时内有效,您需要申请新的访问令牌。

POST https://accounts.google.com/o/oauth2/token
client_id={ClientId}&client_secret={ClientSecret}&refresh_token=1/ffYmfI0sjR54Ft9oupubLzrJhD1hZS5tWQcyAvNECCA&grant_type=refresh_token

回复

{
"access_token" : "ya29.1.AADtN_XK16As2ZHlScqOxGtntIlevNcasMSPwGiE3pe5ANZfrmJTcsI3ZtAjv4sDrPDRnQ",
"token_type" : "Bearer",
"expires_in" : 3600
}

【讨论】:

    猜你喜欢
    • 2021-06-08
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多