使用Ruby为Gmail IMAP访问生成SASL XOAUTH2客户端响应
我正在尝试使用Ruby中的XOAUTH2通过IMAP访问我的Gmail电子邮件。
通过使用OAuth 2.0和oauth2
gem进行身份validation,我已经成功生成了访问令牌(和刷新令牌)。 我将使用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
。 无论我尝试什么,在使用结果validation(在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
这个错误可能完全不相关,但我不相信我尝试过的任何选项都是正确的。
终于想通了……我根本不需要做Base64编码步骤!
gmail_xoauth
将XOAUTH
身份validation gmail_xoauth
添加到Net::IMAP
本身。 我意识到这只需要来自Google的未编码的access_token
,而不是更长的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)
我回来了:
#, raw_data="RUBY0001 OK fredbloggstest@gmail.com Fred Bloggs authenticated (Success)\r\n">
(作为奖励, 这是一个方便的Ruby脚本,用于从OAuth舞蹈中获取access_token
。)