我正在使用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字符串?
答案 0 :(得分:0)
看看: http://google-mail-oauth2-tools.googlecode.com/svn/trunk/python/oauth2.py
,特别是GenerateOAuth2String
,它接受访问令牌(就像你已经拥有的那个)和用户名,并为XOAUTH2生成正确的格式。 (如果您打算将False
与base64_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)