关于passport-local使用问题
本地身份验证策略: 使用用户名和密码进行身份验证。
默认传递字段: username / password , 要想更改必须在 options 中配置
安装
passport-local 依赖于 passport 必须都安装
npm install --save passport
npm install --save passport-local
基本语法
passport.use(new LocalStrategy([options,]callback))
参数
LocalStrategy() 一个参数是 options(可选), 一个是回调函数 callback(必填)
options
usernameField 设置 name 字段, 默认 username
passwordField 设置 password 字段, 默认 password
passReqToCallback 设置 request 是否回调函数的第一个参数, 默认 false (不是第一个参数)
session 设置 是否支持 session 会话, 保持持久化登录状态, 默认 true
callback
done() 第一个参数返回错误信息或者null, 第二个参数返回 用户对象或者其他对象或者false
passport.use(new LocalStrategy(
{
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true,
session: false
},
function([req,]username, password, done) {
User.findOne({ username: username, password: password }, function (err, user) {
done(err, user);
});
}
));
在 nestjs 应用
@Injectable()
export class LocalStrategy extends PassportStrategy( Strategy ) {
constructor ( private readonly authService: AuthService ) {
// passport-local 用例中,没有配置选项,因此我们的构造函数只是调用 super() ,没有 options 对象。
/**
usernameField 设置 name 字段, 默认 username
passwordField 设置 password 字段, 默认 password
passReqToCallback 设置 request 是否回调函数的第一个参数, 默认 true (是第一个参数)
session 设置 是否支持 session 会话, 保持持久化登录状态, 默认 true
*/
super( {
usernameField: 'firstName'
} );
}
async validate ( firstName: string, password: string ): Promise<any> {
const user = await this.authService.validateUser( firstName, password );
if ( !user ) {
throw new UnauthorizedException();
}
// 返回的值自动创建一个 user 对象,并将其作为 req.user 分配给请求对象
return user;
}
}
github
https://github.com/jaredhanson/passport
https://github.com/jaredhanson/passport-local