私たち自身の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
は存在しません。実際には、へのリダイレクト直後には存在しません。
- 何か問題がありますか?
- ルーターの宣言は大丈夫ですか?
- 以前に保存したデータにアクセスできないのはなぜですか?
ありがとうございます。
今すぐこの問題が発生しています。どのようにそれを修正したのですか? – Yomo710
具体的にはhttpsに関連しています。だから私は安全なクッキーオプションを削除し、それはその後、期待どおりに働いた。 – kalnic29