запутался в функциях passize js serializeuser и deserializeuser и в том, как структурировать данные в базе данных моего создания - PullRequest
0 голосов
/ 13 февраля 2020

так что мой экзамен скоро, и я наткнулся на запутанный вопрос, касающийся паспорта, я использую express back-end и «базу данных» (просто карта, где ключ - это имя пользователя, а значение - просто javascript объект с остальной информацией), и мне трудно понять, где я должен поставить идентификатор или он должен быть там вообще. Потому что я знаю, что как только пользователь входит в систему (если он называется так: passport.authenticate ('local')), passport будет go через вашу собственную локальную стратегию, которую вы определили, и тогда вы получите объект пользователя для передачи serializeuser, и эта часть немного сбивает с толку, так как большинство обучающих программ здесь просто помещают user.id, и у меня нет идентификатора в моей базе данных, и я возился с почтальоном и точками останова, кажется, что код переходит от localstrategy непосредственно к serializeuser , где этот идентификатор волшебным образом появляется. Я понимаю, что это, вероятно, идентификатор, используемый для сеанса, который предоставил паспорт, но затем вы получаете идентификатор из deserializeuser, который вы должны использовать, чтобы получить пользователя, и вот еще одна путаница, как я могу получить его из базы данных, если Во-первых, у меня не было идентификатора в базе данных.

Вот код, с которым я работаю, чтобы лучше проиллюстрировать (кстати, не мой код). Вот код для локальной стратегии, вам не нужно заботиться о функции verifyUser, userAccount - это файл базы данных, в который я экспортировал эти функции

passport.use(new LocalStrategy(
/*
    Need to tell which fields represent the  "username" and which the "password".
    This fields will be in a Form or JSON data sent by user when authenticating.
 */
{
    usernameField: 'username',
    passwordField: 'password'
},
function (username, password, done) {

    const ok = userAccounts.verifyUser(username, password);

    if (!ok) {
         return done(null, false, {message: 'Invalid username/password'});
     }

    const userAccount = userAccounts.getUser(username);

    return done(null, userAccount);
}));



passport.serializeUser(function (user, done) {
done(null, user.id);});




passport.deserializeUser(function (id, done) {

const user = userAccounts.getUser(id);

if (user) {
    done(null, user);
} else {
    done(null, false);
}});

, вот база данных с функцией getUser.

const userAccounts = new Map();

function getUser(id){

return userAccounts.get(id);}

тот же код, который используется в localstrategy и deserializeuser, это неправильно или он должен работать по какой-то причине, если он должен работать, то как?

...