3

Ruby で XOAUTH2 を使用して、IMAP 経由で Gmail のメールにアクセスしようとしています。

oauth2gemで OAuth 2.0 を使用して認証することにより、アクセス トークン (およびリフレッシュ トークン) を正常に生成できました。gmail_xoauthIMAP 経由で Gmail にアクセスするために使用します。そのため、Gmail XOAuth2 docsに従って、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これは、Base64 でエンコードされた長い文字列ではなく、Google からのエンコードされていない文字列のみを想定していることに気付きました。

したがって、次の場合:

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">

(おまけとして、これはOAuth ダンスからを取得するための便利な Ruby スクリプトです。)access_token

于 2013-06-06T10:10:35.087 に答える