Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 将passport.js从节点服务器文件集成到路由文件_Node.js_Express_Routes_Passport.js - Fatal编程技术网

Node.js 将passport.js从节点服务器文件集成到路由文件

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进行twitter身份验证。当我把所有的代码都放在一个服务器文件中时,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: '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文件中?别提我的上述评论-我明白你的意思,只是想得太多了。我会接受这个解决方案,我的错误很小,很愚蠢:)