如何在使用PassportJS&重定向后保留会话数据表达

时间:2017-03-03 09:55:29

标签: javascript node.js express oauth-2.0 passport.js

我尝试将用户身份验证到我们自己的oauth2服务器后,将用户重定向到最初发布的URL。 为此,我已经读过可以将数据存储在附加到请求的会话对象中。但是,我在第一次重定向后丢失了数据,因此用户被重定向到我提供的后备网址。

以下是初始化应用

的代码
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');
const session = require('express-session');
const cookieParser = require('cookie-parser');
const auth = require('./auth');

const app = express();
const router = express.Router();

app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(cors());
app.use(session({
  secret: 'keyboard cat',
  cookie: {
   secure: true,
   maxAge: 36000000
  },
  resave: false,
  saveUninitialized: true
}));

auth.config(app);

app.get('/', (req, res) => res.json({ message: 'root' }));
app.get('/failure', (req, res) => res.json({ message: 'fail' }));

// load all the routes
require('../routes/posts')(router, auth);

app.use('/api', router);
app.use('/auth', auth.router);

auth模块如下:

const express = require('express');
const passport = require('passport');

const router = express.Router();

module.exports = {
  config (app) {
    passport.serializeUser((user, done) => done(null, user));
    passport.deserializeUser((obj, done) => done(null, obj));

    passport.use(new OAuth2Strategy({
      authorizationURL,
      tokenURL,
      clientID,
      clientSecret,
      callbackURL
    },
    onAuthorize
    ));

    app.use(passport.initialize());
    app.use(passport.session());

    router.get('/uaa', passport.authenticate('oauth2'));

    router.get('/oauth/callback', passport.authenticate('oauth2'), (req, res) => {
        req.session.save(err => {
          if (err) throw err;
          res.redirect(req.session.redirectTo || '/');
        });
      });
  },

  ensureAuthenticated (req, res, next) {
    if (req.isAuthenticated()) return next();
    if (!req.session.redirectTo) req.session.redirectTo = req.originalUrl;
    req.session.save(err => {
      if (err) return next(err);
      res.redirect('/auth/uaa');
    });
  },

  router
};

现在,如果我在浏览器上请求http://localhost:3333/api/questions(匹配的路由描述为router.route('/questions').get(auth.ensureAuthenticated, PostController.questions.getAll)),我将登陆ensureAuthenticated函数,该函数存储初始路由(/api/questions)但是当我进入我的oauth2回调的最终处理程序时,req.session.redirectTo不存在。事实上,在重定向到/auth/uaa之后它就不再存在了。

  • 我配置错了吗?
  • 我的路由器声明好吗?
  • 为什么我无法访问之前存储的数据?

谢谢。

1 个答案:

答案 0 :(得分:0)

这里的问题是我在通过HTTP提供内容时指定了一个安全的cookie。