连接到 javascript/node.js 中的 Gmail IMAP API

2024-07-01

我正在尝试通过其连接到 gmailIMAP API https://developers.google.com/google-apps/gmail/oauth_overview。我正在使用布鲁诺·莫伦西的节点 imap 库 https://github.com/brunomorency/node-imap#readme为了那个原因。为了创建 oauth_signature、时间戳和随机数,我使用另一个图书馆 http://oauth.googlecode.com/svn/code/javascript/oauth.js.

更具体地说:资源所有者已经对消费者进行了身份验证。所以我确实有一个访问令牌+秘密。当然我也有消费者的secret+token。所以我想要的是使用描述的 XOAuth 机制登录here https://developers.google.com/google-apps/gmail/oauth_protocol(标题:SASL 初始客户请求)。

执行代码时出现错误:

Error while executing request: Invalid credentials d43if2188869web.36

我想知道我做错了什么。其实可能还有更多原因。错误的base64编码(尽管编码可能工作正常,因为不同的编码会出现不同的错误,我很确定这不是它),错误的签名计算(更新:我现在测试了这个http://oauth.net/core/1.0a/#sig_base_example http://oauth.net/core/1.0a/#sig_base_example)、随机数计算或其他。

我可以在java应用程序中使用相同的凭据(消费者+资源所有者)进行身份验证,因此凭据很可能不是错误的原因(只是错误的编码/签名计算)

最后是代码。由于显而易见的原因,我省略了消费者密钥+秘密和资源所有者令牌+秘密)。

var oauth_version = "1.0";
var oauth_timestamp = OAuth.timestamp();
var oauth_nonce = OAuth.nonce(6); //random nonce?

var oauth_consumer_key = "NOTFORYOU"; //validated
var oauth_consumer_secret = "NOTFORYOU"; //validated
var oauth_token = "NOTFORYOU"; //validated
var oauth_token_secret = "NOTFORYOU"; //validated
var email = "NOTFORYOU"; //validated

var oauth_signature_method = "HMAC-SHA1";
var method = "GET";
var action = "https://mail.google.com/b/"
    +email
    +"/imap/"; //gmail's request url

//signature
var oauth_signature_method = "HMAC-SHA1"; //from https://developers.google.com/google-apps/gmail/oauth_protocol

//example values for validating signature from     http://oauth.net/core/1.0a/#sig_base_example
oauth_consumer_key="dpf43f3p2l4k3l03";
oauth_nonce="kllo9940pd9333jh";
oauth_signature_method="HMAC-SHA1";
oauth_timestamp="1191242096";
oauth_token="nnch734d00sl2jdk";
oauth_version="1.0";
action="http://photos.example.net/photos?file=vacation.jpg&size=original";
method="GET";

//signature
var signature_basestring_parameters = {
    oauth_version: oauth_version
    , oauth_consumer_key: oauth_consumer_key
    , oauth_timestamp: oauth_timestamp
    , oauth_nonce: oauth_nonce
    , oauth_token: oauth_token
    , oauth_signature_method: oauth_signature_method
}

//var signature_basestring = oauth_consumer_key+"&"+oauth_token_secret;
var signature_basestring = OAuth.SignatureMethod.getBaseString({method: method, action: action, parameters: signature_basestring_parameters});

var methodName = oauth_signature_method;
var signer = OAuth.SignatureMethod.newMethod(methodName, {
                    consumerSecret: oauth_consumer_secret,
                    tokenSecret: oauth_token_secret
                }
                   );
console.log("signature_basestring=["+signature_basestring+"]");

var oauth_signature = signer.getSignature(signature_basestring);

console.log("oauth_signature=["+oauth_signature+"]");

oauth_signature=OAuth.percentEncode(oauth_signature);

console.log("(escaped) oauth_signature=["+oauth_signature+"]"); //prints out tR3%2BTy81lMeYAr%2FFid0kMTYa%2FWM%3D as in the [example](http://oauth.net/core/1.0a/#sig_base_example)

//base-string
var baseStringDecoded =  "GET"
    + " "
    + "https://mail.google.com/b/"+email+"/imap/"
    + " "
    + "oauth_consumer_key=\""+oauth_consumer_key+"\","
    + "oauth_nonce=\""+oauth_nonce+"\","
    + "oauth_signature=\""+oauth_signature+"\","
    + "oauth_signature_method=\""+oauth_signature_method+"\","
    + "oauth_timestamp=\""+oauth_timestamp+"\","
    + "oauth_token=\""+oauth_token+"\","
    + "oauth_version=\""+oauth_version+"\"";

var baseString = Base64.encode(  //base64 from http://www.webtoolkit.info/javascript-base64.html
    baseStringDecoded
);


//create imap connection
var imap = new ImapConnection({
                  host: 'imap.gmail.com',
                  port: 993,
                  secure: true,
                  debug: true,
                  xoauth: baseString
              });

更新:我发现了一个example http://oauth.net/core/1.0a/#sig_base_example如何生成基本签名字符串。基于此我改变了我的代码。因此,现在我得到与示例中相同的签名结果(生成签名的基本字符串,计算签名值,百分比编码签名值)。这意味着我(即使用的 oauth 库)很可能以正确的方式计算 oauth_signature 而其他地方出了问题。


最后我成功了。最后我的问题是我更改了 oauth.js 中用于测试 oauth 示例的密钥,将其更改回来完成了工作。

因此,上面的示例现在应该可以在 gmail IMAP API 上进行身份验证

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

连接到 javascript/node.js 中的 Gmail IMAP API 的相关文章

  • 在 1 级深度上翻转键值对

    我有对象 const pairs A D 1 2 3 B D 3 2 1 C D 4 3 2 1 B 0 1 2 3 我怎样才能让它翻转 const fliped D A 1 2 3 B 3 2 1 C 4 3 2 1 B C 0 1 2
  • JavaScript 可以在重新加载后保持任何状态吗?

    有没有办法让 JavaScript 通过重新加载来保存任何变量 如果用户点击重新加载按钮 一旦页面重新加载 JavaScript 是否会保留任何状态 建议 Cookie HTML 5 网络存储https www w3schools com
  • 使用 Javascript 隐藏数据网格列?

    我有一个包含大约 20 列的 net 数据网格 我需要使用 JavaScript 通过单击按钮来切换列的可见性 有任何想法吗 您想使用 COLGROUP 来执行此操作 否则您必须应用样式every细胞开启everyrow 这将非常低效 并且
  • Next.js 切换 div 标签的显示

    Code export default function Header let showMe false function toggle showMe showMe return lt gt
  • dc.js 和 crossfilter 减少了一周中每天的平均计数

    我很难正确设置我的交叉过滤器组 也许有人可以给个提示 我的数据结构看起来或多或少是这样的 datetime 2014 01 01 20 00 00 id 1 datetime 2014 01 01 22 21 08 id 2 datetim
  • Phantomjs / Casper.js 带有旋转代理?

    我有一个简单的目标 使用以下任一方式加载网页phantom js 开箱即用 或casper js 很好也更容易 但是使用代理并旋转它如果当前列表不好 即网页加载失败或类似情况 则从列表中选择 我知道 casper js 有 proxypar
  • NodeJS AMQP 客户端无法连接

    最近两天我快疯了 我无法在 NodeJS 客户端上通过持久交换和持久队列建立连接 PHP 代码创建并发送消息
  • 未捕获的 NotFoundError:无法在“Node”上执行“insertBefore”:

    我有一个div另外三个里面的哪里div附加如下 状态值是通过循环 api 的结果来设置的componentWillReceiveProps 但我遇到了一个错误的问题 Uncaught NotFoundError Failed to exec
  • MomentJS:如何将 MM/DD/YYYY 中的日期解析为 DD/MM/YYYY

    如何在澳大利亚和美国时间格式中使用 moment js 例如 07 08 2017 对于两种时间格式都有好处 但是 30 08 2017 对于 moment js 无效 但我可以有这样的 dateTime 您可以在这里检查 http jsf
  • 显示为问号的度unicode

    以下代码显示为问号而不是度数符号 var airF Math round Number MDTMOBILE RWISWeather i AirTemp u00B0 F tempTable find td eq 4 text airF var
  • 如何获取 Firebase ID

    有人知道如何获取 Firebase 唯一 id 吗 我试过了name name key key 什么都不起作用 我可以看到数据 但不知道如何取回 id 我需要它 Create new customers into firebase func
  • 将框架外页面重定向到index.htm中的特定框架

    我在 index html 文件上使用框架 在框架的每个页面上 我都有一个代码来检查页面是否在框架中 如果没有 则重定向到index html 现在 我不仅想检查页面是否在框架中并重定向到index html 而且还想在index html
  • 当没有电子邮件客户端时,“mailto:”会做什么?

    我正在开发一个网站 什么是mailto 如果没有电子邮件客户端 如 Outlook Thunderbird 等 如何打开 它可以在我的电脑上运行 该电脑装有 Outlook 但如果有人想要怎么办 mailto 例如 在 gmail com
  • 从 JavaScript 中的内部函数返回?

    我有一个 jQuery 支持的 JavaScript 函数 它迭代字段列表并检查它们是否为空 如果是 则阻止表单的提交 required fields forEach function field if field val field ad
  • 创建具有 async 属性的脚本标签

    我正在注入这样的脚本 var script
  • chrome 对象 console.log 中的奇怪行为

    当我尝试在 Chrome 中 console log 一个对象时 它在 console log 的第一行中指出 您可以在其中看到 Object 此处的小摘要 我的 posts 数组的长度为 0 posts Array 0 然而 当我展开帖子
  • 如何将网页从一个域重定向到另一个域?

    当第一个域 网页 加载时 如何将域重定向到另一个域 纯 HTML 替代方案如下HTML 中的标签 The 0这里是页面在重定向之前必须保持打开状态的秒数 在这种情况下 一旦您加载页面 它就会立即发生 与建议的 JS 解决方案相反 这在禁用
  • HTML / Javascript - 通过单击父行来展开和折叠表行(子行)

    我几天来一直在尝试解决一个问题 终于明白 如 果没有帮助 我将不会成功 我想做一件我们每天在互联网上看到的常见事情 能够单击表格行以显示更多详细信息 但这里的更多细节并不意味着文本块 而是指与父行具有相同形状的子行 以下是 HTML 表格的
  • 通过 http 在两个 Node.js 服务器之间传输文件

    我有两个通过 http 相互通信的 node js express 服务器 server A它还与浏览器通信并可以处理文件上传请求 当文件上传到server A我想将其原样转移到server B以便进一步加工 最好的方法是什么 最好与请求
  • 通过 http 在两个 Node.js 服务器之间传输文件

    我有两个通过 http 相互通信的 node js express 服务器 server A它还与浏览器通信并可以处理文件上传请求 当文件上传到server A我想将其原样转移到server B以便进一步加工 最好的方法是什么 最好与请求

随机推荐

  • ~ C 中的运算符

    该程序的输出是 13 我从来没有完全理解 C 中的 运算符 为什么它给出 13 作为输出 如何将 运算符限制为数字的 4 位 include
  • 如何终止从cin读取?

    我已经尝试了这里列出的一堆方法 但没有一个起作用 它总是在等待更多的输入 我试过了while std getline std cin line 和下面的方法 似乎没有任何作用 include
  • 为什么登录路径不起作用?它继续访问 /Account/Login 但出现 404

    我使用 ASP NET Core 6 MVC 我试图阻止用户通过直接访问 url 来绕过登录页面 例如 我把 Authorize on the SalesController 我期望当用户直接访问 Sales any actions然后他们
  • Android 一加 6(Android 派版) 启动完成 广播接收器不工作

    Android 一加 6 Android 派版 启动完成 广播接收器不工作
  • flex datagrid - 使网格高度动态化并包含它的组件

    HI 我想构建一个具有动态高度值的数据网格 因为行数总是不同的 我还想将高度传达给容纳它的组件 以便它也随着数据网格的增长而增长 任何人都可以帮助我找到创建这样一个动态数据网格的最佳方法 Thanks DataGrid 的高度由其控制row
  • 如何仅在很长的报告的最后一页打印总计?

    如何使总参数只出现在概念较多的报告的最后一页 该报告会不断重复 直到概念列表显示在两页或多页中 总计出现在所有这些中 因为参数 收到 Total 位于页面的页脚上 我需要仅在最后一页的页脚中显示它 如果我将该空格保留为空白并不重要 我只需要
  • 在运行时更改语言的正确方法

    在运行时更改表单语言的正确方法是什么 使用递归手动设置所有控件 例如this https stackoverflow com questions 7556367 how do i change the culture of a winfor
  • 是否可以更改 UISearchBar 占位符的对齐方式?

    由于输入语言不同 我需要以不同的对齐方式显示 UISearchBar I saw 这个答案 https stackoverflow com questions 9251592 how to change the alignment of a
  • Qt:将事件发布到 QThread 的正确方法?

    在我的 Qt 应用程序中 我有一个主线程和一个工作线程 工作线程子类QThread并通过处理事件customEvent 这是主线程发送要由工作线程处理的事件的正确方法吗 QThread myWorkerThread QApplication
  • 使用 Matplotlib 和 TeX 实现均匀间距

    我正在为数学课绘制一些图表 但我无法在绘图图例中正确地获得和平定义的间距 我目前正在使用 对于 TeX 中的单个空间 但会遇到一种情况 其中一个空间比另一个空间稍远 这可能是由于左边的方程占用了多少空间 这是我的代码 import matp
  • 如何使用 Jsoup 仅删除文本中的 html 标签?

    我想使用 JSOUP 从文本中仅删除 html 标签 我使用了这里的解决方案 我之前关于 JSOUP 的问题 https stackoverflow com questions 33466557 jsoup remove only html
  • iOS-Charts 如何将 UIImage 放在点旁边

    我想使用 iOS Charts 和 Swift 来绘制一些折线图来显示数据 现在 我有一个要求 在每个点旁边放置一个小图标 现在我可以在图表上添加 UIImage 但问题是如何正确获取每个点的 CGPoint 坐标 如果我改变设备或设备类型
  • LAPACK正交化函数

    lapack 中是否有现成的例程来执行正交归一化 例如 Gram Schmidt 或 QR 方法的某些变体 如果不是 使用 lapack 执行正交归一化的建议方法是什么 就在这里 看着 sgeqrf single precision rea
  • Go 中将字符串转换为二进制

    在 Go 中如何将字符串转换为其二进制表示形式 Example 输入 A 输出 01000001 在我的测试中 fmt Sprintf b 75 仅适用于整数 将 1 个字符的字符串转换为字节以获得其数字表示形式 s A st fmt Sp
  • 在浏览器中输入有效网址时,React 路由不断重定向到登陆页面

    我有这个路由配置 它工作得很好 只有一件事一直让我烦恼 即使导航应用程序有效 当我转到地址栏并按 Enter 键时 它会将我重定向到 添加用户即使我不更改网址并按 Enter 键 这是我的路线配置 function AppRoutes se
  • OnGuard 许可

    最近 我研究了使用 OnGuard 来帮助诚实的人遵守他们的原则 我同意这里许多人表达的观点 即任何许可制度都无法保护您免受那些想要使用您的软件但不想付费的人的侵害 另一方面 我想避免让其他人太容易为我的程序创建有效密钥 研究完手册和示例后
  • 从 RoR 模型中获取两个随机元素

    我正在尝试使用 RoR 来做一些简单的事情 但在掌握基础知识方面遇到了一些困难 我最接近的背景是 ASP NET MVC 但我发现所有 RoR 教程都重点关注 Rails 真正擅长的内容 脚手架的东西 而不是如何制作自己的操作并让它们使用参
  • 如何在 MYSQL 中通过另一列选择具有 MAX(列值)、PARTITION 的行?

    我有一张球员表现表 CREATE TABLE TopTen id INT UNSIGNED PRIMARY KEY AUTO INCREMENT home INT UNSIGNED NOT NULL datetime DATETIME NO
  • 如何通过CLI / PUTTY访问AWS RDS?

    我是AWS新手 我可以通过putty访问EC2用户 像这样我如何通过 PUTTY 连接 AWS RDS 我有AWS RDS端点 如果我尝试如下 mysql h testing cx2wamr3cbzm us west 2 rds amazo
  • 连接到 javascript/node.js 中的 Gmail IMAP API

    我正在尝试通过其连接到 gmailIMAP API https developers google com google apps gmail oauth overview 我正在使用布鲁诺 莫伦西的节点 imap 库 https gith