Если вы посмотрите на код ниже
this.passport = passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'pwd',
passReqToCallback:true
},(req:any,username: any, password: any, done: any) => {
UserDetailsRepo.fetch(username)
.then(function (userDetails: UserDetails) {
if (!userDetails) {
return done(null, false, { errorCode: HttpStatus.UNAUTHORIZED, message: 'Incorrect username.' });
}
if (!userDetails.validatePassword(password)) {
return done(null, false, { errorCode: HttpStatus.UNAUTHORIZED, message: 'Incorrect password.' });
}
try {
return done(null, userDetails.getLoginUserDetails(req.body.role,req.body.department));
} catch (e){
return done(null, false, { errorCode: HttpStatus.UNAUTHORIZED, message: e.message } );
}
})
.catch((err: any) => {
return done(err);
})
}))
passReqToCallback : true добавляется к LocalStrategy. Когда мы устанавливаем его значение true, мы получим запрос в качестве первого аргумента в callback функции LocalStrategy, т.е.
( req : любой, имя пользователя: любой, пароль: любой, готово: любой)
Где посмотреть?
Если вы видите в коде конструктора LocalStrategy
declare class Strategy extends PassportStrategy {
constructor(
options: IStrategyOptionsWithRequest,
verify: VerifyFunctionWithRequest
);
constructor(options: IStrategyOptions, verify: VerifyFunction);
constructor(verify: VerifyFunction);
name: string;
}
В приведенном выше коде есть два основных интерфейса
IStrategyOptionsWithRequest , IStrategyOptions
interface IStrategyOptions {
usernameField?: string;
passwordField?: string;
session?: boolean;
passReqToCallback?: false;
}
interface IStrategyOptionsWithRequest {
usernameField?: string;
passwordField?: string;
session?: boolean;
passReqToCallback: true;
}
Теперь ясно, что, передав значение true или false в passReqToCallback , мы получим объект request в обратном вызове LocalStrategy.
Зачем помещать запрос как первый аргумент в обратном вызове?
Если вы посмотрите на код конструктора выше, то увидите две функции VerifyFunctionWithRequest и VerifyFunction
Первый аргумент в интерфейсе VerifyFunctionWithRequest : req
Надеюсь, это понятно ...
interface VerifyFunctionWithRequest {
(
req: express.Request,
username: string,
password: string,
done: (error: any, user?: any, options?: IVerifyOptions) => void
): void;
}
interface VerifyFunction {
(
username: string,
password: string,
done: (error: any, user?: any, options?: IVerifyOptions) => void
): void;
}