使用护照时,我的回调 URL 中一直出现 Cannot GET /auth/twitter/callback。我究竟做错了什么?
I keep getting Connot GET /auth/twitter/callback in my callbackURL when using passport. What am I doing wrong?
我看到过关于这个问题的类似帖子,但是 none 这些答案似乎解决了我的问题。在几个答案中包括缺少的连字符。
当我将用户发送到 Twitter 以使用 Passport 进行身份验证时,浏览器说我的回调 URL 没有 GET 处理程序。我非常困惑,因为我相信我确实处理了它,但它不起作用。
在我的 app.js 文件中我有:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var passport = require('passport');
var session = require('express-session');
app.set('views', './views');
app.set('view engine', 'jade');
app.use(express.static('public'));
app.use(express.static("node_modules/bootstrap/dist"));
app.use(express.static("node_modules/jquery/dist"));
app.use(express.static('img'));
app.use(require('express-session')({
secret:'prince', resave: false, saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
var authRouter = require('./admin/auth');
app.use("/admin/login", authRouter);
var frontPageFlow = require('./index');
app.get('/', frontPageFlow, function (req, res) {
res.render('index', {
title: "Crowd District"
});
});
在我的 Auth.js 文件中我有:
var express = require('express');
var passport = require('passport');
var TwitterStrategy = require('passport-twitter').Strategy;
var router = express.Router();
module.exports = router;
router.get('/auth/twitter',
passport.authenticate('twitter'),
function (req, res) {
res.render('login')
});
router.get('/auth/twitter/callback',
passport.authenticate('twitter', {
successRedirect: '/',
failureRedirect: '/login'
}));
router.route('/')
.get(function (req, res) {
res.render("login");
})
.post(passport.authenticate('twitter', {
successRedirect: '/',
failureRedirect: '/admin/login'
})
);
passport.use(new TwitterStrategy({
consumerKey: 'Consumer key here',
consumerSecret: 'Consumer secret here',
callbackURL: 'http://localhost:9000/auth/twitter/callback'
},
function(token, tokenSecret, profile, cb) {
User.findOrCreate({ twitterId: profile.displayName }, function (err, user) {
if (err) { return cb(null, profile); }
if (!user){
user = new User ({
name: profile.displayName,
email: profile.emails[0].value,
username: profile.username,
provider: 'twitter'
});
user.save(function (err) {
if (err) console.log(err);
console.log("successful user entry!");
return done(err, user);
});
} else {
return done(err, user);
}
});
}
));
还有我的userModel.js
var mongoose = require('mongoose');
var express = require('express');
var router = express.Router();
module.exports = router;
var schemaOptions = {
collection: "users"
};
var schema = new mongoose.Schema({
id : String,
token : String,
displayName : String,
username : String
}, schemaOptions);
module.exports = mongoose.model('User', schema);
无论我做什么,或者重新排列操作顺序,我都会继续得到我的回调:
Cannot GET /auth/twitter/callback?oauth_token=enfwejngfon2804&oauth_verifier=LK35h5988gieunrgbr4ghghi
非常感谢您!
您的路由路径不正确,因为您使用的是 app.use("/admin/login", authRouter);
,这使得该文件中的所有路由都有一个前缀 '/admin/login'
,因此您的代码期望的不是 '/auth/twitter/callback'
,而是 '/admin/login/auth/twitter/callback'
。让你所有的路径都对齐,你的体型会更好。我建议在调用 app.use
时避免挂载前缀。它们只会导致这种混乱。只需使用 app.use(authRouter);
并使您的路线路径成为绝对路径。它们更易于使用。
我看到过关于这个问题的类似帖子,但是 none 这些答案似乎解决了我的问题。在几个答案中包括缺少的连字符。
当我将用户发送到 Twitter 以使用 Passport 进行身份验证时,浏览器说我的回调 URL 没有 GET 处理程序。我非常困惑,因为我相信我确实处理了它,但它不起作用。
在我的 app.js 文件中我有:
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var passport = require('passport');
var session = require('express-session');
app.set('views', './views');
app.set('view engine', 'jade');
app.use(express.static('public'));
app.use(express.static("node_modules/bootstrap/dist"));
app.use(express.static("node_modules/jquery/dist"));
app.use(express.static('img'));
app.use(require('express-session')({
secret:'prince', resave: false, saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
var authRouter = require('./admin/auth');
app.use("/admin/login", authRouter);
var frontPageFlow = require('./index');
app.get('/', frontPageFlow, function (req, res) {
res.render('index', {
title: "Crowd District"
});
});
在我的 Auth.js 文件中我有:
var express = require('express');
var passport = require('passport');
var TwitterStrategy = require('passport-twitter').Strategy;
var router = express.Router();
module.exports = router;
router.get('/auth/twitter',
passport.authenticate('twitter'),
function (req, res) {
res.render('login')
});
router.get('/auth/twitter/callback',
passport.authenticate('twitter', {
successRedirect: '/',
failureRedirect: '/login'
}));
router.route('/')
.get(function (req, res) {
res.render("login");
})
.post(passport.authenticate('twitter', {
successRedirect: '/',
failureRedirect: '/admin/login'
})
);
passport.use(new TwitterStrategy({
consumerKey: 'Consumer key here',
consumerSecret: 'Consumer secret here',
callbackURL: 'http://localhost:9000/auth/twitter/callback'
},
function(token, tokenSecret, profile, cb) {
User.findOrCreate({ twitterId: profile.displayName }, function (err, user) {
if (err) { return cb(null, profile); }
if (!user){
user = new User ({
name: profile.displayName,
email: profile.emails[0].value,
username: profile.username,
provider: 'twitter'
});
user.save(function (err) {
if (err) console.log(err);
console.log("successful user entry!");
return done(err, user);
});
} else {
return done(err, user);
}
});
}
));
还有我的userModel.js
var mongoose = require('mongoose');
var express = require('express');
var router = express.Router();
module.exports = router;
var schemaOptions = {
collection: "users"
};
var schema = new mongoose.Schema({
id : String,
token : String,
displayName : String,
username : String
}, schemaOptions);
module.exports = mongoose.model('User', schema);
无论我做什么,或者重新排列操作顺序,我都会继续得到我的回调:
Cannot GET /auth/twitter/callback?oauth_token=enfwejngfon2804&oauth_verifier=LK35h5988gieunrgbr4ghghi
非常感谢您!
您的路由路径不正确,因为您使用的是 app.use("/admin/login", authRouter);
,这使得该文件中的所有路由都有一个前缀 '/admin/login'
,因此您的代码期望的不是 '/auth/twitter/callback'
,而是 '/admin/login/auth/twitter/callback'
。让你所有的路径都对齐,你的体型会更好。我建议在调用 app.use
时避免挂载前缀。它们只会导致这种混乱。只需使用 app.use(authRouter);
并使您的路线路径成为绝对路径。它们更易于使用。