我试图在NodeJS上使用OAuth进行身份验证,但出现以下错误:

获取OAuth请求令牌时出错:{statusCode:401,data:'\n\n桌面应用程序仅支持OAuth_回调值'oob\'\n/OAuth/request_令牌\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);

提前谢谢.

推荐答案

在你的Twitter设置开发者账户中填写"回调URL"字段.

Node.js相关问答推荐

Mongoose:如何在文档中推送到Caped(有限大小,滚动窗口)数组?

如何在Firebase Cloud Function v2计划函数中设置代码中的时区?

条件内的表达式

NodeJS:zlib.gzipSync 在不同平台上给出不同的明文输出

仅在 vue 脚本未退出的情况下使用 docker 时出现错误

Gulp 能否向 Docker 发出增量构建的第一次迭代完成的信号?

具有项目外部子路径导入的 Firebase 函数

如何通过node下载zip并直接解压zip?

无法使用 node 预签名 url 从 React 将图像文件上传到 s3

多字段传递获取查询失败

(Mongoose) 删除 TTL 字段失败

简单的 Node js 程序但执行顺序似乎不同?

try 运行迁移时的 Typeorm:缺少必需的参数:dataSource

从 CoffeeScript 中的数组中删除一个值

Mongoose:查找、修改、保存

所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?

使用 ES6 语法和动态路径导入模块

如何使用 Node.js 在服务器端管理多个 JS 文件

我应该如何在 webpack 中使用时刻时区?

要求('babel/register')不起作用