Passport JS - 错误:无法将用户序列化到会话中(已检查现有解决方案,但对我不起作用)

问题描述 投票:0回答:1

我还注意到,点击登录端点后,它会直接转到

passport.serializeUser
。但不是
passport.use(new Strategy

顺便说一句,我使用 connect-typeorm 进行会话存储

这是我的代码,以获得更好的视图:

@中间件/护照

import { PassportStatic } from 'passport';
import { Strategy } from 'passport-local';

import IUser from '@common/interface/user-interface';

import { User } from '@entity/User';
import { UserService } from '@service/user-service';
import { pick } from '@utils/pick';

export const passportInitialize = (passport: PassportStatic) => {
  passport.use(
    new Strategy(async (email, password, done) => {
      const user = new UserService();

      const getUser = await user.getUserByEmail(email);

      if (!User.isPasswordMatch(getUser.password, password)) {
        return done('Incorrect password', false);
      }

      done(null, pick(getUser, ['id', 'firstName', 'lastName', 'emailAddress']));
    }),
  );

  passport.serializeUser(async (user, done) => {
    // set/persist user data

    done(null, user);
  });
  passport.deserializeUser(async (user: IUser, done) => {
    // retreive user data
    done(null, user);
  });
};

应用程序.ts

import express, { Application, NextFunction } from 'express';
import httpStatus from 'http-status';
import passport from 'passport';
import { passportInitialize } from '@middleware/passport';

import { Server } from 'http';
import session from 'express-session';

import ApiError from '@utils/handle-api-error';
import { errorConverter, errorHandler } from '@middleware/error';
import logger from '@common/logger';
import routes from '@router/index';
import { sessionConfig } from '@common/config/session-config';

class App {
  public app: Application;

  constructor(public port: number) {
    this.app = express();
    this.initMiddleware();
  }

  private initMiddleware(): void {
    this.app.use(express.json());
    console.log(sessionConfig);
    this.app.use(session(sessionConfig));
    this.app.use(passport.initialize());
    this.app.use(passport.session());
    passportInitialize(passport);

    this.app.use('/api', routes);

    // for error handling
    this.app.use((_req, _res, next: NextFunction) => {
      next(new ApiError(httpStatus.NOT_FOUND, 'Not found'));
    });
    this.app.use(errorConverter);
    this.app.use(errorHandler);
  }

  public listen(): Server {
    const server = this.app.listen(this.port, () => {
      logger.info(`App listening on port: ${this.port}`);
    });

    return server;
  }
}

export default App;

@config/会话配置:

import 'dotenv/config';

import { TypeormStore } from 'connect-typeorm';
import { Session } from '@entity/Session';

import { AppDataSource } from '@database/data-source';

const sessionRepository = AppDataSource.getRepository(Session);

export const sessionConfig = {
  secret: process.env.SESSION_SECRET ?? 'DEFAULT_SECRET_SESSION_NAME',
  resave: false,
  saveUninitialized: true,
  cookie: {
    maxAge: 1 * 3600 * 1000, // 1 hour,
  },
  store: new TypeormStore({
    cleanupLimit: 2,
    ttl: 86400,
  }).connect(sessionRepository),
};

最后,登录端点:

import httpStatus from 'http-status';
import passport from 'passport';
import { NextFunction, Request, Response } from 'express';

import ApiError from '@utils/handle-api-error';
import catchAsyncErrors from 'src/middlewares/handle-async-errors';
import logger from '@common/logger';

class AuthController {
  public login = catchAsyncErrors(async (req: Request, res: Response, next: NextFunction): Promise<void> => {
    logger.info('User logging in');

    passport.authenticate('local', (err, user, info) => {
      if (err) throw new ApiError(httpStatus.BAD_REQUEST, err);

      req.logIn(user, (err) => {
        if (err) throw new ApiError(httpStatus.BAD_REQUEST, err);

        logger.info(`User login success: ${user}`);

        res.status(httpStatus.OK).json({
          message: 'Login successfully',
        });
      });
    })(req, res, next);
  });
}

export default AuthController;
node.js passport.js passport-local node.js-typeorm
1个回答
0
投票

奇怪,我只是将电子邮件更改为用户名,它就起作用了,

© www.soinside.com 2019 - 2024. All rights reserved.