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

Posted

技术标签:

【中文标题】在 javascript/node.js 中连接到 Gmail IMAP API【英文标题】:Connecting to the Gmail IMAP API in javascript/node.js 【发布时间】:2012-04-05 10:49:17 【问题描述】:

我正在尝试通过其IMAP API 连接到 gmail。为此,我正在使用 Bruno Morency 的node-imap library。为了创建 oauth_signature、timestamp 和 nonce,我使用 another library。

更具体地说:资源所有者已经对消费者进行了身份验证。所以我确实有一个访问令牌+秘密。当然我也有消费者的秘密+token。所以我想要的是使用here 描述的 XOAuth 机制登录(标题:SASL Initial Client Request)。

执行代码时出现错误:

Error while executing request: Invalid credentials d43if2188869web.36

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

我可以在 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 如何生成基本签名字符串。基于此,我更改了代码。因此,现在我得到了与示例相同的签名结果(为签名生成基本字符串、计算签名值、百分比编码签名值)。这意味着我(即使用的 oauth 库)很可能以正确的方式计算 oauth_signature,而其他地方出了问题。

【问题讨论】:

【参考方案1】:

我终于成功了。最后我的问题是我更改了 oauth.js 中的密钥以测试 oauth 示例,将其更改回来就可以了。

所以上面的例子现在应该可以在 gmail IMAP API 上进行身份验证了

【讨论】:

【参考方案2】:

如果您认为它与编码相关,请查看 How to do Base64 encoding in node.js? 以获取节点的 bas64 而不是 webtoolkit。

【讨论】:

以上是关于在 javascript/node.js 中连接到 Gmail IMAP API的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中连接到 websocket

在 Python 中连接到 MS Access

无法在 php 中连接到 mysql 8

如何在 Codeigniter 3 中连接到 POSTGRESQL?

在 Katalon Studio 中连接到 Oracle SQL

如何在bash中连接到wifi?