3

我正在尝试使用 Ruby 中的 XOAUTH2 通过 IMAP 访问我的 Gmail 电子邮件。

oauth2通过使用 OAuth 2.0 和gem进行身份验证,我成功生成了访问令牌(和刷新令牌) 。我将使用gmail_xoauth通过 IMAP 访问 Gmail。所以我现在需要根据Gmail XOAuth2 文档生成 SASL 初始客户端响应:

The SASL XOAUTH2 initial client response has the following format:  

    base64("user=" {User} "^Aauth=Bearer " {Access Token} "^A^A")

using the base64 encoding mechanism defined in RFC 4648.
^A represents a Control+A (\001).

我不清楚我如何在我的字符串中表示“Control+A”。我只是使用^A吗?

key = Base64.encode64("user=#{email}^Aauth=Bearer #{access_token_obj.token}^A^A")

此 python 脚本用于\1代替^A. 我也试过了\001。无论我尝试什么,在验证(在 irb 中)时,我得到的结果是:

>> imap = Net::IMAP.new('imap.gmail.com', 993, usessl=true, certs=nil, verify=false)
>> imap.authenticate('XOAUTH2', email, key)
OpenSSL::SSL::SSLError: SSL_write:: bad write retry

该错误可能完全不相关,但我不相信我尝试过的任何选项都是正确的。

4

1 回答 1

4

终于想通了……我根本不需要做 Base64 编码步骤!

gmail_xoauth XOAUTH身份验证器添加到Net::IMAP自身。我意识到这只需要access_token来自 Google 的未编码字符串,而不是更长的 Base64 编码字符串。

因此,如果:

email = `fredbloggstest@gmail.com`
# The result of the OAuth2 dance (as well as a refresh_token):
access_token = 'ya13.AHES6Y3F54_5fAoz_8VuG-7pzQAo3R0_ukt7dhfgRnJh41Q'

那么我不必对任何内容进行 Base64 编码。我只是做:

imap = Net::IMAP.new('imap.gmail.com', 993, usessl=true, certs=nil, verify=false)
imap.authenticate('XOAUTH2', email, access_token)

我回来了:

#<struct Net::IMAP::TaggedResponse tag="RUBY0001", name="OK", data=#<struct Net::IMAP::ResponseText code=nil, text="fredbloggstest@gmail.com Fred Bloggs authenticated (Success)">, raw_data="RUBY0001 OK fredbloggstest@gmail.com Fred Bloggs authenticated (Success)\r\n">

(作为奖励,这是一个方便的 Ruby 脚本,用于access_token从 OAuth 舞蹈中获取。)

于 2013-06-06T10:10:35.087 回答