Express、Passport認証でreq.userが取れない
Passport認証で、req.userが空っぽになってしまうのはなぜ?
こんにちは。
自分は初めてNode.jsでアプリ開発を行なっている大学生です。
現在Node.jsとExpressでアプリを作っており、Passport認証を実装しています。
サインイン、アウト、サインアップいずれの機能もうまく動いたのですが、index.jsにてreq.userでサインインしているユーザーの情報を取得しようとしたのですが、なぜか空のまま帰ってきてしまいます。
その原因と解決法を知りたいです。よろしくお願いします。
実現したいこと
サインインしたユーザーの情報を取得して、index.ejsに「ようこそ、○○さん」と表示させたい。
該当のソースコード
index.js
1var express = require('express'); 2var router = express.Router(); 3const knex = require('../db/knex'); 4 5/* GET home page. */ 6router.get('/', function (req, res, next) { 7 const isAuth = req.isAuthenticated(); 8 if (isAuth) { 9 const userName = req.user.name; 10 res.render('index', { 11 title: 'Allgiri App', 12 username: userName, 13 isAuth: isAuth, 14 }); 15 } else { 16 res.render('index', { 17 title: 'Allgiri App', 18 isAuth: isAuth, 19 }); 20 } 21}); 22 23router.post('/', function (req, res, next) { 24 const userId = req.session.userid; 25 const isAuth = Boolean(userId); 26 const userName = req.user.name; 27 28 res.render('index', { 29 title: 'Allgiri App', 30 username: userName, 31 isAuth: isAuth, 32 }); 33}); 34 35router.use('/signup', require('./signup')); 36router.use('/signin', require('./signin')); 37router.use('/signout', require('./signout')); 38router.use('/gametop', require('./gametop')); 39 40module.exports = router;
passport.js
1const passport = require("passport"); 2const LocalStrategy = require("passport-local"); 3const knex = require("../db/knex"); 4const bcrypt = require("bcrypt"); 5const User = require("../models/user"); 6const cookieSession = require("cookie-session"); 7const secret = "secretCuisine123"; 8 9module.exports = function (app) { 10 passport.serializeUser(function (user, done) { 11 done(null, user.id); 12 }); 13 14 passport.deserializeUser(function (id, done) { 15 try { 16 const user = User.findById(id); 17 done(null, user); 18 } catch (error) { 19 done(error, null); 20 } 21 }); 22 23 passport.use(new LocalStrategy({ 24 usernameField: "username", 25 passwordField: "password", 26 }, function (username, password, done) { 27 knex("users") 28 .where({ 29 name: username, 30 }) 31 .select("*") 32 .then(async function (results) { 33 if (results.length === 0) { 34 return done(null, false, { message: "Invalid User" }); 35 } else if (await bcrypt.compare(password, results[0].password)) { 36 return done(null, results[0]); 37 } else { 38 return done(null, false, { message: "Invalid User" }); 39 } 40 }) 41 .catch(function (err) { 42 console.error(err); 43 return done(null, false, { message: err.toString() }) 44 }); 45 } 46 )); 47 48 app.use( 49 cookieSession({ 50 name: "session", 51 keys: [secret], 52 53 // Cookie Options 54 maxAge: 24 * 60 * 60 * 1000, // 24 hours 55 }) 56 ); 57 58 app.use(passport.initialize()); 59 app.use(passport.session()); 60}; 61
app.js
1const createError = require('http-errors'); 2const express = require('express'); 3const path = require('path'); 4const cookieParser = require('cookie-parser'); 5const logger = require('morgan'); 6 7const app = express(); 8 9// view engine setup 10app.set('views', path.join(__dirname, 'views')); 11app.set('view engine', 'ejs'); 12 13app.use(logger('dev')); 14app.use(express.json()); 15app.use(express.urlencoded({ extended: false })); 16app.use(cookieParser()); 17app.use(express.static(path.join(__dirname, 'public'))); 18 19// authorization 20require("./config/passport")(app); 21 22// router 23app.use('/', require('./routes')); 24 25// catch 404 and forward to error handler 26app.use(function(req, res, next) { 27 next(createError(404)); 28}); 29 30// error handler 31app.use(function(err, req, res, next) { 32 // set locals, only providing error in development 33 res.locals.message = err.message; 34 res.locals.error = req.app.get('env') === 'development' ? err : {}; 35 36 // render the error page 37 res.status(err.status || 500); 38 res.render('error'); 39}); 40 41module.exports = app;
試したこと
こちらのソースコードを真似て実装しました。
https://zenn.dev/wkb/books/node-tutorial/viewer/todo_10
お手数お掛けしますが、何卒よろしくお願いします!!
回答1件