我还注意到,点击登录端点后,它会直接转到
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;
奇怪,我只是将电子邮件更改为用户名,它就起作用了,