我正在尝试通过其连接到 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 而其他地方出了问题。