servidor configurar ruby oauth gmail imap sasl

ruby - configurar - servidor imap gmail



GeneraciĆ³n de respuesta del cliente SASL XOAUTH2 para el acceso Gmail IMAP con Ruby (1)

Intento acceder a mis correos electrónicos de Gmail sobre IMAP usando XOAUTH2 en Ruby.

He generado correctamente un token de acceso (y un token de actualización) al autenticar utilizando OAuth 2.0 con la gema oauth2 . Voy a usar gmail_xoauth para acceder a Gmail a través de IMAP. Así que ahora necesito generar la respuesta del cliente inicial de SASL, según los documentos de Gmail XOAuth2 :

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).

No tengo claro cómo represento el "Control + A" en mi cadena. ¿Simplemente uso ^A ?

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

Este script python usa /1 en lugar de ^A También probé /001 . Cualquier cosa que intento, al autenticar (en irb) con el resultado que obtengo:

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

Ese error podría no estar relacionado en absoluto, pero no estoy seguro de que alguna de las opciones que he probado sea correcta.


Finalmente lo descubrí ... ¡No necesitaba hacer el paso de codificación Base64 en absoluto!

gmail_xoauth agrega el autenticador XOAUTH a Net::IMAP . Me di cuenta de que esto solo espera el access_token codificar de Google, en lugar de la cadena codificada en Base64 más larga.

Así que si:

email = `[email protected]` # The result of the OAuth2 dance (as well as a refresh_token): access_token = ''ya13.AHES6Y3F54_5fAoz_8VuG-7pzQAo3R0_ukt7dhfgRnJh41Q''

entonces no tengo que Base64 codificar nada. Solamente lo hago:

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

y vuelvo:

#<struct Net::IMAP::TaggedResponse tag="RUBY0001", name="OK", data=#<struct Net::IMAP::ResponseText code=nil, text="[email protected] Fred Bloggs authenticated (Success)">, raw_data="RUBY0001 OK [email protected] Fred Bloggs authenticated (Success)/r/n">

(Como access_token adicional, este es un útil script de Ruby para obtener el access_token del baile de OAuth).