【问题标题】:Google Apps 2-leg OAuth2.0 with XOAUTH2带有 XOAUTH2 的 Google Apps 2-leg OAuth2.0
【发布时间】:2014-01-18 23:55:57
【问题描述】:

我正在使用 Google python api 客户端构建一个带有 服务帐户 的 SignedJwtAssertionCredentials 对象,该对象可成功用于模拟用户并访问某些 API,例如日历,例如:

credentials = SignedJwtAssertionCredentials(CLIENT_ID, PRIVATE_KEY, SCOPE)
http = httplib2.Http()
http = credentials.authorize(http)
service = build('calendar', 'v3', http = http)
...

我正在寻找一种方法来使用这些凭据通过 IMAP 和 XOAUTH2 进行连接,这意味着我需要构建一个 XOAUTH2 字符串,例如:

'user=<EMAIL_ADDR>\1auth=Bearer <ACCESS_TOKEN>\1\1'

使用常规 OAuth2,ACCESS_TOKEN 部分可以轻松刷新和获取。 我试过了:

credentials = SignedJwtAssertionCredentials(
  CLIENT_ID, PRIVATE_KEY, "https://mail.google.com/",
  prn = "required_user@email.com")
credentials.refresh(httplib2.Http())

并在 XOAUTH2 字符串中使用credentials.access_token,但它不起作用。

有什么方法可以将 SignedJwtAssertionCredentials 转换为 XOAUTH2 字符串?

【问题讨论】:

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


    【解决方案1】:

    看看: http://google-mail-oauth2-tools.googlecode.com/svn/trunk/python/oauth2.py

    特别是GenerateOAuth2String,它接受一个访问令牌(就像你已经拥有的那个)和一个用户名,并为 XOAUTH2 生成正确的格式。 (诀窍是如果您打算将其与imaplib 一起使用,请记住将False 传递给base64_encode 参数,否则它会被编码两次。)

    也就是说,根据记忆,服务帐户实际上不能像自己一样发送/接收电子邮件,但是如果您使用域模拟来模拟域中的用户(您提到过,但我在上面的代码示例),它应该可以正常工作。

    【讨论】:

    • 谢谢,我已更新问题代码以包含模拟。几天前我实际上已经解决了这个问题。
    【解决方案2】:

    回答我自己的问题:

    所以问题中的代码确实有效。问题是我试图冒充的用户禁用了 Marketplace 应用程序。

    完整代码如下:

    user_email = 'a@b.com'
    credentials = SignedJwtAssertionCredentials(
        CLIENT_ID, PRIVATE_KEY, "https://mail.google.com/", prn = user_email)
    credentials.refresh(httplib2.Http())
    xoauth2_string = 'user=%s\1auth=Bearer %s\1\1' % (
        user_email, credentials.access_token)
    

    【讨论】:

      猜你喜欢
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 2014-11-02
      • 2014-03-24
      • 1970-01-01
      • 2021-02-27
      • 2012-12-23
      • 1970-01-01
      相关资源
      最近更新 更多