jaredhanson / passport

Simple, unobtrusive authentication for Node.js.
https://www.passportjs.org?utm_source=github&utm_medium=referral&utm_campaign=passport&utm_content=about
MIT License
22.93k stars 1.24k forks source link

passport.authenticate is not a function - Username and Password Tutorial #927

Closed Drew-Daniels closed 2 years ago

Drew-Daniels commented 2 years ago

I am following the Username & Password Tutorial on the docs, and on the Establish Session Page, after completing typing in this bit of code, I get the following error:

app.use(passport.authenticate('session'));

image

Expected behavior

I would not expect this to happen after following the tutorial step by step.

Actual behavior

Steps to reproduce

Follow the steps in the Username and Password tutorial up to the part in Establish a Session, where you add the line:

app.use(passport.authenticate('session'));

And see the following error pictured above.

Here is my code:

app.js:

require('dotenv').config();

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var passport = require('morgan');
var session = require('express-session');

var SQLiteStore = require('connect-sqlite3')(session);

var indexRouter = require('./routes/index');
var authRouter = require('./routes/auth');

var app = express();

app.locals.pluralize = require('pluralize');

// 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')));
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: false,
  store: new SQLiteStore({ db: 'sessions.db', dir: './var/db' })
}));
app.use(passport.authenticate('session'));

app.use('/', indexRouter);
app.use('/', authRouter);

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

auth.js:

var express = require('express');
var passport = require('passport');
var LocalStrategy = require('passport-local');
var crypto = require('crypto');
var db = require('../db');

var router = express.Router();

passport.use(new LocalStrategy(function verify(username, password, cb) {
   db.get('SELECT * FROM users WHERE username = ?', [ username ], function(err, row) {
      if (err) return cb(err);
      if (!row) return cb(null, false, { message: 'Incorrect username or password.' });

      crypto.pbkdf2(password, row.salt, 310000, 32, 'sha256', function(err, hashedPassword) {
         if (err) return cb(err);
         if (!crypto.timingSafeEqual(row.hashed_password, hashedPassword)) {
            return cb(null, false, { message: 'Incorrect username or password.' });
         }
         return cb(null, row);
      });
   });
}));

router.get('/login', function getLoginPage(req, res, next) {
   res.render('login');
});
router.post('/login/password', passport.authenticate('local', {
   successRedirect: '/',
   failureRedirect: '/login'
}));

module.exports = router;

package.json:

{
  "name": "todos-express-starter",
  "version": "0.0.0",
  "private": true,
  "description": "Starter todo app using Express, Passport, and SQLite for sign in.",
  "keywords": [
    "example",
    "express",
    "passport",
    "sqlite"
  ],
  "author": {
    "name": "Jared Hanson",
    "email": "jaredhanson@gmail.com",
    "url": "https://www.jaredhanson.me/"
  },
  "homepage": "https://github.com/passport/todos-express-starter",
  "repository": {
    "type": "git",
    "url": "git://github.com/passport/todos-express-starter.git"
  },
  "bugs": {
    "url": "https://github.com/passport/todos-express-starter/issues"
  },
  "funding": {
    "type": "github",
    "url": "https://github.com/sponsors/jaredhanson"
  },
  "license": "Unlicense",
  "scripts": {
    "start": "node ./bin/www",
    "devstart": "nodemon ./bin/www"
  },
  "dependencies": {
    "connect-sqlite3": "^0.9.13",
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "dotenv": "^8.6.0",
    "ejs": "~2.6.1",
    "express": "~4.16.1",
    "express-session": "^1.17.3",
    "http-errors": "~1.6.3",
    "mkdirp": "^1.0.4",
    "morgan": "~1.9.1",
    "passport": "^0.6.0",
    "passport-local": "^1.0.0",
    "pluralize": "^8.0.0",
    "sqlite3": "^5.0.2"
  },
  "devDependencies": {
    "nodemon": "^2.0.19"
  }
}

Environment

Drew-Daniels commented 2 years ago

Nevermind, user error - required morgan instead of passport 😵‍💫