Express + Паспорт JS не может читать сообщения sh - PullRequest
2 голосов
/ 06 апреля 2020

У меня есть проект Express + Passport + Firebase, в котором я выполняю аутентификацию с использованием локальной стратегии. Поскольку я обнаружил, что Passport позаботится о процессе аутентификации, я также обнаружил, что он будет принимать сообщения fla sh в качестве третьего параметра для функции done() (в стратегии). Но я не уверен, как их читать:

Я предполагаю, что поток, который я сделал для установки и чтения сообщений fla sh, был:

  1. Install connect -fla sh с NPM.

  2. Установить промежуточное ПО Express после его импорта:

import * as flash from 'connect-flash';
...
const app = express();
...
app.use(flash());
Настройка проверки подлинности паспорта на маршруте Express в соответствии с документацией :
// POST - /api/v1/admin/oauth/login
router.post(
    '/login',
    async (req: Request, res: Response) => { /* middleware function to validate input */ },
    passport.authenticate('local', {
        failureRedirect: '/api/v1/admin/oauth/login',
        failureFlash: true
    }),
    async (req: Request, res: Response) => { /* function after success login */
);
Включить сообщения fla sh в метод done(), согласно Документация по конфигурации паспорта :
import { Strategy as LocalStrategy } from 'passport-local';
import db from '../../config/database';
import * as bcrypt from 'bcryptjs';

export default new LocalStrategy({ usernameField: 'email' }, async (email, password, done) => {
    const ref = db.collection('users').doc(email);
    try {
        const doc = await ref.get();
        if (!doc.exists) {
            return done(null, false, { error: 'Wrong email' });
        }

        const user = doc.data();

        const match: boolean = await bcrypt.compare(password, user.password);
        if (!match) {
            return done(null, false, { error: 'Wrong password' });
        }

        user.id = doc.id;
        delete user.password;

        return done(null, user);

    } catch(error) {
        return done(error);
    }
});
Прочитать сообщения fla sh, используя req.flash('error'):
// GET - /api/v1/admin/oauth/login
router.get('/login', (req: any, res: Response) => {
    const result: IResult = {
        message: '',
        data: null,
        ok: false
    };
    if (req.flash('error')) {
        resultado.message = req.flash('error');
        console.log(req.flash('error'));
    }
    return res.status(400).json(result);
});

Я думал, что это теоретически работает в моем уме, до шага 5, где req.flash('error') имеет пустой массив в Это. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Вы передаете сообщение FLA sh неправильно!

3-й аргумент done() должен быть объектом с полями type и message:

return done(null, false, { message: 'Wrong email' });

Тип по умолчанию error.

Этот API-интерфейс явно не задокументирован, но показан в 3-м примере Verify Callback в разделе в Configure Глава Паспорта. js Документация.

Я создал репо с минимально воспроизводимым рабочим примером.

0 голосов
/ 16 апреля 2020

Я продолжаю поиск, и я нашел решение, но оно работает во второй попытке входа в систему.

Шаги из моего вопроса, который я изменил, чтобы заставить его работать:

  1. Установить connect-fla sh с NPM.

  2. Установить промежуточное ПО Express после его импорта:

import * as flash from 'connect-flash';
...
const app = express();
...
app.use(flash());
Настройка проверки подлинности паспорта на маршруте Express в соответствии с документацией :
// POST - /api/v1/admin/oauth/login
router.post(
    '/login',
    async (req: Request, res: Response) => { /* middleware function to validate input */ },
    passport.authenticate('local', { 
        failureFlash: true,
        failureRedirect: '/api/v1/admin/oauth/login' 
    }),
    async (req: Request, res: Response) => { /* function after success login */
);
Создайте другой маршрут, чтобы он мог отображать сообщение fla sh, благодаря @Codebling:
// GET - /api/v1/admin/oauth/login
router.get('/login', (req: Request, res: Response) => {
    const result: IResult = {
        message: 'Auth ok',
        data: null,
        ok: true
    };

    let status: number = 200;
    const flashMessage: any = req.flash('error');

    if (flashMessage.length) {
        resultado.message = flashMessage[0];
        resultado.ok = false;
        status = 400; 
    }

    return res.status(status).json(result);
});
Включить сообщения fla sh в метод done(), согласно Документация по конфигурации паспорта :
import { Strategy as LocalStrategy } from 'passport-local';
import db from '../../config/database';
import * as bcrypt from 'bcryptjs';

export default new LocalStrategy({ usernameField: 'email' }, async (email, password, done) => {
    const ref = db.collection('users').doc(email);
    try {
        const doc = await ref.get();
        if (!doc.exists) {
            return done(null, false, { message: 'Wrong email' });
        }

        const user = doc.data();

        const match: boolean = await bcrypt.compare(password, user.password);
        if (!match) {
            return done(null, false, { message: 'Wrong password' });
        }

        user.id = doc.id;
        delete user.password;

        return done(null, user);

    } catch(error) {
        return done(error);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...