2017-03-03 40 views
0

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

下面是初始化应用程序的代码

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); 

中的授权模块如下:

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(匹配路由descrition是router.route('/questions').get(auth.ensureAuthenticated, PostController.questions.getAll))我登陆存储初始路由的ensureAuthenticated函数(/api/questions),但当我登录到我的oauth2回调的最终处理程序时,req.session.redirectTo不存在。实际上,它在重定向到/auth/uaa后不再存在。

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

谢谢。

回答

0

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

+0

现在有这个问题。你怎么解决它? – Yomo710

+1

在我的具体情况下,它与https相关。所以我删除了安全cookie选项,并在此后按预期工作。 – kalnic29

相关问题