【问题标题】:oauth 1.0 -invalid signature GetRequestToken for Googleoauth 1.0 - Google 的无效签名 GetRequestToken
【发布时间】:2014-01-18 22:15:18
【问题描述】:

我找不到 Google 对 Oauth 1.0 的任何有效支持,因为它已被弃用。 但是由于我想访问 Gmail 数据,我必须使用 Oauth 1.0

因此,我从 2 天以来一直在尝试为我的 Google 应用程序获取 RequestToken,但我收到了无效签名错误。 我的基本字符串与 google 返回的调试字符串匹配。

我已尝试同时使用 HMAC-SHA1 和 RSA-SHA1,并且我的密钥是正确的。 (我什至尝试过使用谷歌推荐的非注册应用程序的匿名令牌和秘密。) 可能是由于错误的随机数或某些百分比编码问题造成的。 同样的方法也适用于 Twitter。

我也在下面粘贴我的代码,如果有人可以帮助或将我指向正确的论坛,我会很高兴。

    $('#GMAIL_BUTTON').click(function () {
    //oauth1 approach similar to twitter
    var requestUrl = "https://www.google.com/accounts/OAuthGetRequestToken";
    var scope = "https://mail.google.com/";
    var clientID = "anonymous";
    var clientSecret = "anonymous";
    var rsakey = "MIICblahblahblah";
    var timestamp = Math.round(new Date().getTime() / 1000.0);
    var nonce = Math.random();        
    var sigBaseStringParams = "oauth_consumer_key=" + clientID;
    sigBaseStringParams += "&" + "oauth_nonce=" + nonce;
    sigBaseStringParams += "&" + "oauth_signature_method=HMAC-SHA1";
    sigBaseStringParams += "&" + "oauth_timestamp=" + timestamp;
    sigBaseStringParams += "&" + "scope=" + encodeURIComponent(scope);
    var sigBaseString = "GET&";
    sigBaseString += encodeURIComponent(requestUrl) + "&" +        encodeURIComponent(sigBaseStringParams) + "\n" + "\n";
    requestUrl += "?scope=https://mail.google.com/";
    var keyText = encodeURIComponent(clientSecret) + "&";
    //var keyText = rsakey;
    var keyMaterial =     Windows.Security.Cryptography.CryptographicBuffer.convertStringToBinary(keyText, Windows.Security.Cryptography.BinaryStringEncoding.Utf8);
    var macAlgorithmProvider = Windows.Security.Cryptography.Core.MacAlgorithmProvider.openAlgorithm("HMAC_SHA1");
    var key = macAlgorithmProvider.createKey(keyMaterial);
    //var keyMaterial = Windows.Security.Cryptography.CryptographicBuffer.decodeFromBase64String(rsakey);
    //var macAlgorithmProvider = Windows.Security.Cryptography.Core.AsymmetricKeyAlgorithmProvider.openAlgorithm("RSASIGN_PKCS1_SHA1");
    //var key = macAlgorithmProvider.importKeyPair(keyMaterial);
    var tbs = Windows.Security.Cryptography.CryptographicBuffer.convertStringToBinary(sigBaseString, Windows.Security.Cryptography.BinaryStringEncoding.Utf8);
    var signatureBuffer = Windows.Security.Cryptography.Core.CryptographicEngine.sign(key, tbs);
    var signature =    Windows.Security.Cryptography.CryptographicBuffer.encodeToBase64String(signatureBuffer);
    var dataToPost = "OAuth oauth_consumer_key=\"" + clientID + "\", oauth_nonce=\"" + nonce + "\", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"" + timestamp + "\", oauth_signature=\"" + encodeURIComponent(signature) + "\", oauth_version=\"1.0\"";
    var response = sendGetRequest(requestUrl, dataToPost, null);
});

而SendGetRequest方法是-

   function sendGetRequest(url, authzheader, params) {
    try {
        var request = new XMLHttpRequest();
        request.open("GET", url, false);
        request.setRequestHeader("Authorization", authzheader);
        request.send(params);
        return request.responseText;
    } catch (err) {
        WinJS.log("Error sending request: " + err, "Web Authentication SDK Sample", "error");
    }
}

【问题讨论】:

    标签: javascript oauth


    【解决方案1】:

    我在您的代码中找不到任何明显的错误,但您可能会更轻松地将 Google 的 OAuth 2 用于https://developers.google.com/accounts/docs/OAuth2UserAgent 的客户端应用程序库。此外,您可能想要使用 atom 提要范围 (https://mail.google.com/mail/feed/atom) - 您可以在 https://code.google.com/oauthplayground/ 尝试它和其他范围。

    【讨论】:

    • OP 可能想要访问GMail over IMAP/SMTP with OAuth 而不是未读邮件原子提要。这仅适用于 OAuth 1。
    • 谢谢。我克服了。我认为问题与某些 URL 编码问题有关。
    • @gauravkejriwal 然后发布你如何解决它作为答案。
    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    相关资源
    最近更新 更多