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

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

新規登録して質問してみよう
ただいま回答率
87.20%
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アプリケーションを提供します。

受付中

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

Do1904
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アプリケーションを提供します。

1回答

0リアクション

3クリップ

194閲覧

投稿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

var express = require('express'); var router = express.Router(); const knex = require('../db/knex'); /* GET home page. */ router.get('/', function (req, res, next) { const isAuth = req.isAuthenticated(); if (isAuth) { const userName = req.user.name; res.render('index', { title: 'Allgiri App', username: userName, isAuth: isAuth, }); } else { res.render('index', { title: 'Allgiri App', isAuth: isAuth, }); } }); 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, }); }); router.use('/signup', require('./signup')); router.use('/signin', require('./signin')); router.use('/signout', require('./signout')); router.use('/gametop', require('./gametop')); module.exports = router;

passport.js

const passport = require("passport"); const LocalStrategy = require("passport-local"); const knex = require("../db/knex"); const bcrypt = require("bcrypt"); const User = require("../models/user"); const cookieSession = require("cookie-session"); const secret = "secretCuisine123"; module.exports = function (app) { passport.serializeUser(function (user, done) { done(null, user.id); }); passport.deserializeUser(function (id, done) { try { const user = User.findById(id); done(null, user); } catch (error) { done(error, null); } }); passport.use(new LocalStrategy({ usernameField: "username", passwordField: "password", }, function (username, password, done) { knex("users") .where({ name: username, }) .select("*") .then(async function (results) { if (results.length === 0) { return done(null, false, { message: "Invalid User" }); } else if (await bcrypt.compare(password, results[0].password)) { return done(null, results[0]); } else { return done(null, false, { message: "Invalid User" }); } }) .catch(function (err) { console.error(err); return done(null, false, { message: err.toString() }) }); } )); app.use( cookieSession({ name: "session", keys: [secret], // Cookie Options maxAge: 24 * 60 * 60 * 1000, // 24 hours }) ); app.use(passport.initialize()); app.use(passport.session()); };

app.js

const createError = require('http-errors'); const express = require('express'); const path = require('path'); const cookieParser = require('cookie-parser'); const logger = require('morgan'); const app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); // authorization require("./config/passport")(app); // router app.use('/', require('./routes')); // catch 404 and forward to error handler app.use(function(req, res, next) { next(createError(404)); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;

試したこと

こちらのソースコードを真似て実装しました。
https://zenn.dev/wkb/books/node-tutorial/viewer/todo_10

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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

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

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

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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アプリケーションを提供します。