Как получить http request.body или запросить в паспорте обратный вызов LocalStrategy - PullRequest
0 голосов
/ 10 апреля 2019

Просто хотите получить http запрос или request.body внутри обратного вызова LocalStrategy, как вы можете видеть в прикрепленных файлах, которые мы кодируем следующим образом новая локальная стратегия ({ usernameField: 'email', passwordField: 'pwd' }, (имя пользователя: любое, пароль: любое, сделано: любое) => { Мы можем получить имя пользователя и пароль, но я хочу получить весь req.body

  1. Я хочу получить некоторую дополнительную информацию, которая передается в запросе на вход в систему, и хочу сохранить эту дополнительную информацию как часть созданного сеанса.
  2. Я пытался решить эту проблему с помощью метода req.logIn () для паспорта внутри функции обратного вызова passport.authenticate ('local', callback).
  3. Это сработало, но проблема здесь в том, что метод passport.serialize вызывается дважды, поэтому он создает две сессии. Я хочу избежать создания двойной сессии.
  4. Следовательно, я решил получить дополнительную информацию о методе LocalStrategy.

Код

import UserDetailsRepo from '../../repo/UserDetailsRepo'
import UserDetails from '../../model/UserDetails'
import * as passport from 'passport'
import { Strategy as LocalStrategy } from 'passport-local'
// import JwtConfiguration from './express-jwt-config'
import * as HttpStatus from 'http-status-codes'

class PassportAuth {
    public passport: any;
    constructor() {
        this.passport = passport.use(new LocalStrategy({
            usernameField: 'email',
            passwordField: 'pwd'
          },(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.' });
                    }
                    return done(null,  userDetails);
                })
                .catch((err: any) => {
                    return done(err);
                })
        }))
        // passport.use(JwtConfiguration.getStrategy())
        passport.serializeUser(function (user, done) {
            if(!user) {
                done({ errorCode: HttpStatus.UNPROCESSABLE_ENTITY,message:'ser' },user)
            } else {
                done(null, user);
            }
        });

        passport.deserializeUser(function (user, done) {
            console.log("Deseriaize User");
            console.log(user);
            done(null, user);
        });
    }
}
export default new PassportAuth().passport;


router.post('/login', passport.authenticate('local'), (req: Request, res: Response, next: NextFunction) => {
            passport.authenticate('local', (err: any, user: UserDetails, info: any) => {
                if (user) {
                    let loginUser = user.checkAttributes(req.body.role, req.body.department);
                    // if (loginUser) {
                        req.logIn(loginUser, function (err) {
                            if (err) {
                                next(err)
                            }
                            next()
                        });
                    // } else {
                    //  next({ errorCode: HttpStatus.UNPROCESSABLE_ENTITY })
                    // }
                } else {
                    next(info)
                }
            })(req, res, next)
        }, (req: Request, res: Response) => {
            res.send(req.body)
            res.end()
        });

1 Ответ

0 голосов
/ 10 апреля 2019

Если вы посмотрите на код ниже

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;
}
...