桌面应用程序仅支持oauth_callback值'oob'/ oauth / request_token

时间:2014-01-16 19:00:50

标签: javascript node.js twitter oauth express

我正在尝试使用NodeJS上的OAuth进行身份验证,但我收到此错误:

  

获取OAuth请求令牌时出错:{statusCode:401,data:'\ n \ n桌面应用程序仅支持oauth_callback值\'oob \'\ n / oauth / request_token \ n \ n'}

这是我的代码(server.js)

var express = require('express');
var util = require('util');
var oauth = require('oauth');

var app = express.createServer();

// Get your credentials here: https://dev.twitter.com/apps
var _twitterConsumerKey = "1";
var _twitterConsumerSecret = "2";

var consumer = new oauth.OAuth(
    "https://twitter.com/oauth/request_token", "https://twitter.com/oauth/access_token", 
    _twitterConsumerKey, _twitterConsumerSecret, "1.0A", "http://127.0.0.1:8080/sessions/callback", "HMAC-SHA1");

app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.session({ secret: "very secret" }));

    app.use(function(req, res, next) {
        res.locals.user = req.session.user;
        next();
    });
});

app.get('/sessions/connect', function(req, res){
    consumer.getOAuthRequestToken(function(error, oauthToken, oauthTokenSecret, results){
        if (error) {
            res.send("Error getting OAuth request token : " + util.inspect(error), 500);
        } else {  
            req.session.oauthRequestToken = oauthToken;
            req.session.oauthRequestTokenSecret = oauthTokenSecret;
            res.redirect("https://twitter.com/oauth/authorize?oauth_token="+req.session.oauthRequestToken);      
        }
    });
});

app.get('/sessions/callback', function(req, res){
    util.puts(">>"+req.session.oauthRequestToken);
    util.puts(">>"+req.session.oauthRequestTokenSecret);
    util.puts(">>"+req.query.oauth_verifier);
    consumer.getOAuthAccessToken(req.session.oauthRequestToken, req.session.oauthRequestTokenSecret, req.query.oauth_verifier, function(error, oauthAccessToken, oauthAccessTokenSecret, results) {
        if (error) {
            res.send("Error getting OAuth access token : " + util.inspect(error) + "["+oauthAccessToken+"]"+ "["+oauthAccessTokenSecret+"]"+ "["+util.inspect(results)+"]", 500);
        } else {
            req.session.oauthAccessToken = oauthAccessToken;
            req.session.oauthAccessTokenSecret = oauthAccessTokenSecret;

            res.redirect('/home');
        }
    });
});

app.get('/home', function(req, res){
    consumer.get("http://twitter.com/account/verify_credentials.json", req.session.oauthAccessToken, req.session.oauthAccessTokenSecret, function (error, data, response) {
        if (error) {
            res.redirect('/sessions/connect');
            // res.send("Error getting twitter screen name : " + util.inspect(error), 500);
        } else {
            var parsedData = JSON.parse(data);

            // req.session.twitterScreenName = response.screen_name;    
            res.send('You are signed in: ' + parsedData.screen_name);
        } 
    });
});

app.get('*', function(req, res){
    res.redirect('/home');
});

app.listen(8080);

提前致谢。

3 个答案:

答案 0 :(得分:125)

填写Twitter设置开发者帐户中的“回拨网址”字段。

答案 1 :(得分:21)

除了另一个答案所说的......

在尝试填充Twitter开发者控制台中的回调URL时,我一直收到错误消息。我试图输入http://localhost:4000,但它给了我错误。如果您需要使用localhost,则可以使用http://127.0.0.1:4000代替,而Twitter会接受{。}}。

(对某些人来说可能很明显,但我花了一点时间来弄明白。)

答案 2 :(得分:1)

这是一个老问题,但我今天遇到了这个错误,我注意到的事情是新的Twitter应用程序可以在没有回调URL的情况下保存,但只要您使用回调URL保存您的应用程序, Twitter不会让你保存它 - 它将恢复到你拥有的最后一个URL。在我们的例子中,由于我们的OAuth流提供了回调URL,因此无关紧要,但在Twitter的一方需要有回调URL(任何回调URL)。因此,在我们的案例中,此错误仅在具有与之关联的新(未使用)Twitter应用程序的开发环境中出现。