使用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_xoauthXOAUTH身份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 。)