在 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Codeigniter 3 中连接到 POSTGRESQL?