web-dev-qa-db-ja.com

デスクトップアプリケーションは、oauth_callback値 'oob' / oauth / request_tokenのみをサポートします

NodeJSでOAuthで認証しようとしていますが、このエラーが表示されます。

OAuth request token:{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);

前もって感謝します。

45
felipekm

Twitter設定devアカウントの「コールバックURL」フィールドに入力します。

127
user3248653

他の答えが言うことに加えて...

Twitter開発コンソールでコールバックURLを埋めようとすると、エラーが発生し続けました。入力しようとしていたhttp://localhost:4000、しかしそれは私にエラーを与えていた。 localhostを使用する必要がある場合は、http://127.0.0.1:4000代わりに、Twitterはそれを受け入れます。

(たぶん一部の人には明らかですが、それを理解するのに少し時間がかかりました。)

21
matthewpalmer

これは古い質問ですが、今日このエラーに遭遇しました。新しいTwitterアプリケーションはコールバックURLなしで保存できますが、コールバックURLでアプリを保存するとすぐに、Twitter保存することはできません-持っていた最後のURLに戻ります。私たちの場合、OAuthフローはコールバックURLを提供するので問題ありませんが、Twitter側の何かにコールバックURL(コールバックURL)が必要です。このエラーは、新しい(未使用の)Twitterアプリケーションが関連付けられている開発環境でのみ発生しました。

1
Everett