Как я могу использовать лучше-sqlite3 с локальной аутентификацией passport.js? - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь использовать passport.js с sqlite, но проблема в том, что я не могу сериализовать пользователя, потому что идентификатор не существует

Чтобы сохранить пользователя, я делаю это:

export const saveUser = async (req: Request, res: Response, next: NextFunction) => {
    const users = new UserRepository(db, 'users');
    const hash = bcrypt.hash(req.body.password, 10);
    const user = new User(
        req.body.gender,
        req.body.first_name,
        req.body.last_name,
        req.body.email.toLowerCase(),
        await hash,
        req.body.dob,
        req.body.zip_code,
        req.body.house_number,
        req.body.addition || null,
    );
    const emailExists = users.findOne({ email: req.body.email.toLowerCase() });
    if (emailExists) {
        return res.redirect('/users/register');
    } else {
        users.create(user);
        req.logIn(user, (err) => {
            if (err) return next(err);
            res.redirect('/');
        });
    }
};

Запрос выглядит так:

public create(item: T): boolean {
    const query = `
    INSERT INTO ${this.table} (${Object.keys(item).join(',')})
    VALUES (${Object.keys(item).map((_) => '?').join(',')})`;
    const stmt = this.db.prepare(query);
    const result = stmt.run(Object.values(item));

    return !!result.changes;
}

Это моя конфигурация паспорта:

passport.serializeUser((user: any, done) => {
    console.log(user);
    done(undefined, user.id);
});

passport.deserializeUser((id: number, done) => {
    const user = users.findById(id);
    if (!user) return done(undefined, false);
    return done(undefined, user);
});

passport.use(new Strategy({ passReqToCallback: true }, (_, email, password, done) => {
    const user = users.findOne({ email: email.toLowerCase() });
    if (!user) return done(undefined, false);
    bcrypt.compare(password, user.password, (err, isValid) => {
        if (err) return done(err);
        if (!isValid) return done(undefined, false);
        return done(undefined, user);
    });
}));

Я не могу сериализовать пользователя, потому что в объекте не возвращен идентификатор, может кто-нибудьпомогите мне заставить работать паспортную аутентификацию?

...