Node.js 将passport.js从节点服务器文件集成到路由文件
我目前正试图在一个项目中使用节点服务器中的passport进行twitter身份验证。当我把所有的代码都放在一个服务器文件中时,passport的功能正如预期的那样。以下是服务器文件的摘录,其中包含所有路由:Node.js 将passport.js从节点服务器文件集成到路由文件,node.js,express,routes,passport.js,Node.js,Express,Routes,Passport.js,我目前正试图在一个项目中使用节点服务器中的passport进行twitter身份验证。当我把所有的代码都放在一个服务器文件中时,passport的功能正如预期的那样。以下是服务器文件的摘录,其中包含所有路由: passport.use(new TwitterStrategy({ consumerKey: config.twitter.consumer_key, consumerSecret: config.twitter.consumer_secret, callbackURL:
passport.use(new TwitterStrategy({
consumerKey: config.twitter.consumer_key,
consumerSecret: config.twitter.consumer_secret,
callbackURL: config.twitter.callback_url.dev
}, (token, tokenSecret, profile, done) => {
console.log(token, tokenSecret, profile, done);
process.nextTick(() => {
return done(null, profile);
});
}));
app.use(session({ secret: 'SOMESECRET' }));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, '../public')));
app.set('view engine', 'ejs');
// expose to routes
app.all('*', (request, response, next) => {
request.log = log;
next();
});
app.get('/', (req, res) => {
res.render('pages/index.ejs');
});
// twitter auth endpoint
app.get('/auth/twitter', passport.authenticate('twitter'));
// twitter auth callback endpoint
app.get('/auth/twitter/callback', passport.authenticate('twitter', { failureRedirect: '/' }), (req, res) => {
res.redirect('/');
});
但是,当我尝试将passport从服务器文件公开到路由文件时,身份验证从未发生。我在这里搜索了大部分问题,然后返回到文档,但所有教程都显示了一个服务器文件,其中包含所有路由
服务器文件:
passport.use(new TwitterStrategy({
consumerKey: config.twitter.consumer_key,
consumerSecret: config.twitter.consumer_secret,
callbackURL: config.twitter.callback_url.dev
}, (token, tokenSecret, profile, done) => {
console.log(token, tokenSecret, profile, done);
process.nextTick(() => {
return done(null, profile);
});
}));
app.use(session({ secret: 'SECRET' })); // session secret
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, '../public')));
app.set('view engine', 'ejs');
// expose to routes
app.all('*', (request, response, next) => {
request.log = log;
request.passport = passport;
next();
});
// routes
app.use('/', routes);
路由文件:
import express from 'express';
const routes = express.Router();
import config from '../config.js';
// main
routes.get('/', (req, res) => {
res.render('pages/index.ejs');
});
// twitter auth endpoint
routes.get('/auth/twitter', (req, res) => {
const passport = req.passport;
passport.authenticate('twitter');
});
// twitter auth callback endpoint
routes.get('/auth/twitter/callback', (req, res) => {
const passport = req.passport;
passport.authenticate('twitter', {
failureRedirect: '/'
});
res.redirect('/');
});
module.exports = routes;
我错过了什么?我猜我不能使用
passport.authenticate
函数内部的路由。我仍在试图弄清楚如何使用routes文件使版本正常工作。感谢您的帮助 您可以要求Passport通常无需通过让Passport=req.Passport
获得Passport。这是我用passport为Google Oauth做的小演示
Routes.js
const router = require('express').Router();
const passport = require('passport');
router.get(
'/google',
passport.authenticate('google', {
scope: ['profile', 'email'],
session: false
})
);
router.get(
'/google/callback',
passport.authenticate('google', {
session: false
})
);
Server.js
// passort config
app.use(passport.initialize());
require('./services/passport'); // contains the passport google strategy
// routes
require('./routes')(app);
你为什么要在路线文件上重新定义路线?你的日志呢?我不清楚你在问什么@douxsey?之所以显示routes文件,是因为正如我在文章中所描述的,有两次尝试实现这一点。另外,这篇文章不是关于日志的,我不知道这是如何影响我的问题的这是否意味着您也运行了
constpassport=require('passport')代码>也在你的server.js文件中?别提我的上述评论-我明白你的意思,只是想得太多了。我会接受这个解决方案,我的错误很小,很愚蠢:)