Javascript Chrome扩展/Oauth/Tumblr

Javascript Chrome扩展/Oauth/Tumblr,javascript,google-chrome-extension,oauth,tumblr,Javascript,Google Chrome Extension,Oauth,Tumblr,我正在(尝试)实现一个使用TumblrAPI的Chrome扩展。为此,我需要通过OAuth(1.0a)进行授权 我设法获得了大部分工作授权,但我想我错过了一些东西 我正在编写的Chrome扩展的manifest.json现在看起来像这样: { "name": "Tumblr - Tiled Dashboard", "version": "0.1.1", "manifest_version": 2, "description": "This extension mo

我正在(尝试)实现一个使用TumblrAPI的Chrome扩展。为此,我需要通过OAuth(1.0a)进行授权

我设法获得了大部分工作授权,但我想我错过了一些东西

我正在编写的Chrome扩展的manifest.json现在看起来像这样:

{
    "name": "Tumblr - Tiled Dashboard",
    "version": "0.1.1",
    "manifest_version": 2,
    "description": "This extension modifies the look of your Tumblr dashboard.",
    "icons": {
        "16": "images/icon_16.png",
        "48": "images/icon_48.png",
        "128": "images/icon_128.png"
    },
    "background": {
        "page": "background.html"
    },
    "content_scripts": [
        {
            "matches": [ "*://*.tumblr.com/dashboard" ],
            "css": [ "styles.css" ],
            "js": [ "jquery-2.1.3.min.js", "masonry.min.js", "code.js" ]
        }
    ],
    "permissions": [
        "https://www.google-analytics.com/",
        "https://api.tumblr.com/v2/*",
        "webRequest",
        "storage",
        "tabs",
        "https://www.google.com/accounts/OAuthGetRequestToken", "https://www.google.com/accounts/OAuthAuthorizeToken", "https://www.google.com/accounts/OAuthGetAccessToken"
    ],
    "web_accessible_resources": [ "chrome_ex_oauth.html", "injectedCode.js" ],
    "content_security_policy": "script-src 'self' https://api.tumblr.com/v2/ https://ssl.google-analytics.com; object-src 'self'",
    "homepage_url": "http://desvre.tumblr.com/",
    "author":  "Franz Spitaler"
}
…我想这应该没问题。在my background.html中,实际上只有包含的脚本(google analytics和我从这里获得的三个oauth文件:。这三个文件也包含在我从以前的源下载的第四个文件(“chrome_ex_oauth.html”)中

现在,当我在Extensions(Ctrl+r)中重新加载Chrome扩展时,重定向页面将打开,并将我重定向到Tumblr授权页面,在那里我可以允许访问

因为我还将“chrome_ex_oauth.html”添加到manifest.json中的“web_可访问的_资源”中,所以这是可行的

单击“允许”按钮后出现问题。我只需返回重定向页面(“chrome_ex_oauth.html”),就不会再发生任何事情。当我打开控制台时,我可以看到如下错误消息:

GET https://www.tumblr.com/oauth/access_token?oauth_consumer_key=MY_CONSUMER_KEY&oauth_nonce=D3VeV&oauth_signature=kvhL%2F9GSMuiODoPR%2FyUrUiqzqF0%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1424250463&oauth_token=6khqzjiMFbM7hcqqnNf8hm9ttDELKUVYo2TBQmyLOtepGN9KhJ&oauth_verifier= 400 (Bad Request)
如Google的OAuth教程页面所述,我使用它初始化“后台页面”(这会导致错误消息):

我错过了一些重要的东西吗?我认为manifest.json文件还可以(权限、可访问的web资源?!)


感谢您的帮助。对于OAuth来说,Google Extensions(除了链接页面)确实没有非常好的教程。

正如@abraham所指出的,缺少一个参数,如我发布的错误所示。 我能够跟踪问题,并在chrome_ex_oauth.js文件的函数中找到它。我将函数从:

ChromeExOAuth.formDecode = function(encoded) {
    var params = encoded.split("&");
    var decoded = {};
    for (var i = 0, param; param = params[i]; i++) {
        var keyval = param.split("=");
        if (keyval.length == 2) {
            var key = ChromeExOAuth.fromRfc3986(keyval[0]);
            var val = ChromeExOAuth.fromRfc3986(keyval[1]);
            decoded[key] = val;
        }
    }
    return decoded;
};
为此:

ChromeExOAuth.formDecode = function(encoded) {
    var params = encoded.split("&");
    var decoded = {};
    for (var i = 0, param; param = params[i]; i++) {
        var keyval = param.split("=");
        if (keyval.length == 2) {
            var key = ChromeExOAuth.fromRfc3986(keyval[0]);
            var val = ChromeExOAuth.fromRfc3986(keyval[1]);
            decoded[key] = val;
        }
        else if (keyval.length == 3){
            var key = ChromeExOAuth.fromRfc3986(keyval[0]);
            var val = ChromeExOAuth.fromRfc3986(keyval[1].split("#")[0]);
            decoded[key] = val;
        }
    }
    return decoded;
};
其中最后一个参数没有正确标识,因为我得到的url的结尾如下:
#u=\ uu

使用keyval[1].split(“#”)[0]可以得到所需参数的确切部分


感谢您的帮助,现在一切似乎都正常了。至少需要OAuth授权的请求成功了!

在错误响应
OAuth\u verifier=
中没有任何值。我猜您必须在生成签名之前从
chrome\u ex\u OAuth.html
查询字符串中获取该值。我认为这是一个很好的观点!这是授权后重定向页面的url结尾:
&oauth\u verifier=xf9qdjucchzxjpvgne9k4jng78wshv0zaq0adby53k2qirfry#(uqu=)
。我想我在chrome\u ex\u oauth.js文件中发现了问题:最后一个参数无法正确识别,因为在最后一个“&”-字符之后有两个“=”字符:(……希望我现在能解决这个问题……谢谢你向我指出这一点!我遇到了同样的问题——我想我会分享我的解决方案。在无关的
#
之后,我忽略了一切:将
var params=encoded.split(&)
替换为
var params=encoded.split(“#”)[0]。split(&)
ChromeExOAuth.formDecode = function(encoded) {
    var params = encoded.split("&");
    var decoded = {};
    for (var i = 0, param; param = params[i]; i++) {
        var keyval = param.split("=");
        if (keyval.length == 2) {
            var key = ChromeExOAuth.fromRfc3986(keyval[0]);
            var val = ChromeExOAuth.fromRfc3986(keyval[1]);
            decoded[key] = val;
        }
        else if (keyval.length == 3){
            var key = ChromeExOAuth.fromRfc3986(keyval[0]);
            var val = ChromeExOAuth.fromRfc3986(keyval[1].split("#")[0]);
            decoded[key] = val;
        }
    }
    return decoded;
};