Ответ 1
Заполните поле "Обратный вызов" в настройках вашего аккаунта Twitter.
Я пытаюсь выполнить аутентификацию с помощью OAuth на NodeJS, и я получаю эту ошибку:
Ошибка получения маркера запроса 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);
Спасибо заранее.
Заполните поле "Обратный вызов" в настройках вашего аккаунта Twitter.
В дополнение к тому, что говорит другой ответ...
Я продолжал получать сообщение об ошибке при попытке заполнить URL-адрес обратного вызова в консоли Twitter-dev. Я пытался ввести http://localhost:4000
, но это давало мне ошибки. Если вам нужно использовать localhost
, вы можете использовать http://127.0.0.1:4000
вместо этого, и Twitter принимает это.
(Может быть, очевидный для некоторых, но взял меня немного, чтобы понять это.)
Это старый вопрос, но сегодня я столкнулся с этой ошибкой, и я заметил, что новые приложения Twitter могут быть сохранены БЕЗ URL-адреса обратного вызова, но как только вы сохраните приложение с URL-адресом обратного вызова, Twitter выиграет 't позволить вам сохранить его - он вернется к последнему URL, который у вас был. В нашем случае это не имело значения, так как поток OAuth поставляет URL-адрес обратного вызова, но что-то на стороне Twitter требует, чтобы был обратный URL-адрес (ЛЮБОЙ URL-адрес обратного вызова). Таким образом, в нашем случае эта ошибка возникала только в средах разработчиков, у которых было новое (и неиспользуемое) приложение Twitter, связанное с ними.