带有XOAUTH2的Google Apps双腿OAuth2.0

时间:2014-01-01 10:24:56

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

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

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字符串?

2 个答案:

答案 0 :(得分:0)

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

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

也就是说,从内存中,服务帐户实际上不能发送/接收电子邮件本身,但是如果您使用域模拟来冒充您域中的用户(您提到过,但我没有在上面的代码示例),它应该可以正常工作。

答案 1 :(得分:0)

回答我自己的问题:

所以问题中的代码确实可以正常工作。问题是我试图冒充的用户禁用了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)