質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

1回答

1531閲覧

req.userが空っぽ、、なぜ、?(Express、Passport認証)

Do1904

総合スコア0

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

3クリップ

投稿2022/08/13 15:04

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

お手数お掛けしますが、何卒よろしくお願いします!!

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cocoalix

2022/08/14 04:08 編集

passport.jsですかね、こちら私はあんまり詳しくないので的外れな話をしてしまうかもしれないのですが… > 次に、デシリアライズのコード書きますが、注意点があります。 > findById 関数を実装していないため、上記のサンプルコードのままでは動きません。 > エラー処理も含め、この部分の実装をオリジナルに変更します。 > まず、findById 関数を実装しましょう。 > todoappフォルダ内にmodelsフォルダを作成してください。 > さらに、作成したmodelsフォルダ内にuser.jsという空のファイルを作成してください。 > このuser.jsで findById 関数を実装します。 > 与えられたidを元にusersテーブルからユーザ情報を検索するよう、findById 関数を実装してみましょう。 とありますが、こちらは実装されておりますか? また、 > router.post('/', function (req, res, next) { > const userId = req.session.userid; > const isAuth = Boolean(userId); > const userName = req.user.name; > > res.render('index', { > title: 'Allgiri App', > username: userName, > isAuth: isAuth, > }); > }); とありますが、参考元のZennの記事には > router.post('/', passport.authenticate('local', { > successRedirect: '/', > failureRedirect: '/signin', > failureFlash: true, > } > )); とあります こちら、POST時にpassport.jsでの認証処理が記述されていない可能性はございませんでしょうか?
cocoalix

2022/08/14 04:08

日本語が不自由だったので修正
guest

回答1

0

回答じゃないと気づかれないかもと思いましたので、こちらにも記載致しますね

passport.jsですかね、こちら私はあんまり詳しくないので的外れな話をしてしまうかもしれないのですが…

次に、デシリアライズのコード書きますが、注意点があります。
findById 関数を実装していないため、上記のサンプルコードのままでは動きません。
エラー処理も含め、この部分の実装をオリジナルに変更します。
まず、findById 関数を実装しましょう。
todoappフォルダ内にmodelsフォルダを作成してください。
さらに、作成したmodelsフォルダ内にuser.jsという空のファイルを作成してください。
このuser.jsで findById 関数を実装します。
与えられたidを元にusersテーブルからユーザ情報を検索するよう、findById 関数を実装してみましょう。

とありますが、こちら User.findById() は実装されておりますか?

また、

router.post('/', function (req, res, next) {
const userId = req.session.userid;
const isAuth = Boolean(userId);
const userName = req.user.name;

res.render('index', {
title: 'Allgiri App',
username: userName,
isAuth: isAuth,
});
});

とありますが、参考元のZennの記事には

router.post('/', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/signin',
failureFlash: true,
}
));

とあります
こちら、POST時にpassport.jsでの認証処理が記述されていない可能性はございませんでしょうか?

投稿2022/08/14 04:28

cocoalix

総合スコア62

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Do1904

2022/08/15 08:18

回答ありがとうございます! User.findByIdは別のuser.jsというファイルで定義しており、passport.jsでインポートしています。 また、 router.post('/', passport.authenticate('local', { successRedirect: '/', failureRedirect: '/signin', failureFlash: true, } )); の部分は、別のsignin.jsで使うコードです。、、
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問