2017-03-03 8 views
0

私たち自身のoauth2サーバーに認証した後、ユーザーを最初に発行したURLにリダイレクトしようとしています。 これを行うには、リクエストに添付されたセッションオブジェクトにデータを格納することが可能であることを読んだことがあります。しかし、最初のリダイレクト後にデータが失われてしまい、その結果、ユーザーは指定した代替URLにリダイレクトされます。PassportJS&Expressでリダイレクトした後にセッションデータを保持する方法

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)ある):ここ

は、次のようにアプリ

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

認証モジュールが初期化コードであります私は最初のルート(/api/questions)を格納するensureAuthenticated機能に着陸しますが、私がoauth2コールバックの最終ハンドラに着陸するときには、req.session.redirectToは存在しません。実際には、へのリダイレクト直後には存在しません。

  • 何か問題がありますか?
  • ルーターの宣言は大丈夫ですか?
  • 以前に保存したデータにアクセスできないのはなぜですか?

ありがとうございます。

答えて

0

ここで問題となっていたのは、HTTP経由でコンテンツを処理しているときに安全なCookieを指定したことでした。

+0

今すぐこの問題が発生しています。どのようにそれを修正したのですか? – Yomo710

+1

具体的にはhttpsに関連しています。だから私は安全なクッキーオプションを削除し、それはその後、期待どおりに働いた。 – kalnic29

関連する問題