使用 Ruby 生成 Gmail IMAP 访问的 SASL XOAUTH2 客户端响应

2024-03-24

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

我已通过使用 OAuth 2.0 进行身份验证,成功生成了访问令牌(和刷新令牌)oauth2 https://github.com/intridea/oauth2宝石。我要使用gmail_xoauth https://github.com/nfo/gmail_xoauth通过 IMAP 访问 Gmail。所以我现在需要生成 SASL 初始客户端响应,如下所示Gmail XOAuth2 文档 https://developers.google.com/gmail/xoauth2_protocol:

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脚本 http://google-mail-oauth2-tools.googlecode.com/svn/trunk/python/oauth2.py uses \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

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


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

gmail_xoauth 添加了XOAUTH验证器 https://github.com/nfo/gmail_xoauth/blob/master/lib/gmail_xoauth/imap_xoauth2_authenticator.rb to Net::IMAP http://ruby-doc.org/stdlib-1.9.3/libdoc/net/imap/rdoc/Net/IMAP.html#method-i-authenticate本身。我意识到这只需要未编码的access_token来自 Google,而不是更长的 Base64 编码字符串。

So, if:

email = `[email protected] /cdn-cgi/l/email-protection`
# 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="[email protected] /cdn-cgi/l/email-protection Fred Bloggs authenticated (Success)">, raw_data="RUBY0001 OK fredbl[email protected] /cdn-cgi/l/email-protection Fred Bloggs authenticated (Success)\r\n">

(作为奖励,这是一个方便的 Ruby 脚本 https://gist.github.com/jotto/2932998为了得到access_token来自 OAuth 舞蹈。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ruby 生成 Gmail IMAP 访问的 SASL XOAUTH2 客户端响应 的相关文章

随机推荐

  • 使用 Excel 宏 VBA 在 Excel 范围内查找行的最快方法

    我有一个 Excel 电子表格 sheet2 其中记录的数量约为 100 万条 我正在迭代这些记录 并且对于每次迭代 我都会将一行选定的列与sheet1 中大约2000 条记录的另一个范围进行比较 rangeA 1 Million rows
  • 在 Ember-CLI 内升级 Ember

    我刚刚创建了一个新的Ember CLI http www ember cli com app v0 1 12 并注意到 Ember 的引用版本是 v1 8 1 bower json 我想得到最近发布了1 10 http emberjs co
  • 在scala中使用正则表达式提取字符串

    我有一个用例 我想从 scala 的输入中提取某些字符串 我的输入字符串看起来像 asdwf ssdf as232 ss ABC xxx sdfsf234 sdaf 我想提取xxx after ABC 我尝试定义正则表达式匹配模式 val
  • WPF 控件是否在其绑定中使用弱事件?

    当我在 WPF 中使用数据绑定时 我的目标控件正在侦听绑定源上的事件 例如 我可能有一个ListView http msdn microsoft com en us library system windows controls listv
  • foreach 中对 Dictionary 的解构

    在 C 7 中是否可以在字典的 foreach 循环中使用解构 像这样的事情 var dic new Dictionary
  • Objective-C 前向调用:

    我经常做这样的事情 CoolViewController coolViewController CoolViewController alloc init self navigationController pushViewControll
  • VBA 函数避免使用 If 语句

    我正在构建一个非常复杂的 VBA 工作簿 运行大部分代码的问题之一是性能 我有一个内置函数 或多或少可以执行以下操作 Public Function zzz xxx as String as String if xxx apple then
  • 如何在 gradle.properties 文件中声明列表?

    当我尝试在 gradle properties 文件中编写类似的内容时 defaultTasks deploy 我收到下一条消息 BUILD FAILED FAILURE Build failed with an exception Wha
  • 绝对导入:React 和 Typescript

    背景 我有一个使用引导的 React 应用程序create react app和打字稿 随着应用程序的增长 goal 我想实现绝对导入 我正在使用 VS Code Visual Studio Code 只需很少的配置 我就可以让 TS 和
  • template-id 与任何模板声明都不匹配

    我遇到了令人沮丧的编译器错误 我似乎无法解决 这与模板专业化有关 但我看不出有什么问题 include thread lock guard inl 23 error template id lock guard lt gt for thre
  • 如何在 Sass 中强制 CSS 变量为整数?

    如果这是一个简单的问题 请原谅我 但我正在 CodePen 上解决这个问题 并且不知道发生了什么 我有代码 root ile 10 for i from 0 to var ile 问题是 Codepen 声称 var ile 不是整数 嗯
  • Swift 3 本地通知未触发

    我有以下设置 并且根本没有通知被触发 基于堆栈上的其他类似问题 我为每个请求添加了唯一标识符 并将正文添加到了内容中 我有这个请求用户许可的功能 func sendIntNotifications 1 Request permission
  • 替换具有错误高程值的片段

    你好 堆栈溢出 我还有另一个片段问题 我使用的是 android app Fragment 不支持片段 我正在尝试替换一个片段 但这并不像使用那么简单 fragmentTransaction replace containerId newF
  • Akka 的语言和产品替代品是什么?

    现在我正在看游戏框架 https www playframework com 并且非常喜欢它 Play 中提供的功能中最受宣传的部分之一是Akka http akka io 为了更好地理解 Akka 以及如何正确使用它 您能告诉我其他语言或
  • 无法安装 libc6 软件包

    esrsank PG04954 sudo apt get install libc6 i386 Reading package lists Done Building dependency tree Reading state inform
  • getExternalCacheDir() 清除数据后返回 null

    我有一个简单的应用程序 可以访问数据并将数据写入外部存储 一切正常 直到我进入 设置 gt 应用程序 gt 应用程序信息 并通过 清除数据 按钮清除数据 然后每次调用getExternalCacheDir 开始返回 null 我一直在运行
  • 当尝试获取应用程序方向时,“statusBarOrientation”在 iOS 13.0 中已被弃用

    简单地说 我依靠以下代码来提供应用程序的方向 在应用程序中使用它有几个原因 根据 UX 规范 stackview 的布局是根据 iPad 的方向设置的 横向时为水平 纵向时为垂直 在上一项的基础上 stackview 被放置在屏幕的左侧 纵
  • Visual Studio 2017 重构不适用于 F#

    我有项目在F 我正在尝试VisualStudio2017 我尝试重构代码并使用内联 但此菜单项不可用 另外当我点击Rename什么都没发生 为什么不可用 如何强制refactor操作才能工作 let blobToBlobWithInfo b
  • MySQL 有没有办法将 IN 和 LIKE 结合起来?

    我目前正在运行这样的查询 SELECT FROM email WHERE email address LIKE ajones OR email address LIKE bsmith OR email address LIKE cjohns
  • 使用 Ruby 生成 Gmail IMAP 访问的 SASL XOAUTH2 客户端响应

    我正在尝试使用 Ruby 中的 XOAUTH2 通过 IMAP 访问我的 Gmail 电子邮件 我已通过使用 OAuth 2 0 进行身份验证 成功生成了访问令牌 和刷新令牌 oauth2 https github com intridea