2017-03-03 76 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