Как заставить форму аутентификации HTML и веб-токены JSON взаимодействовать вместе в Ionic / Angular

#node.js #angular #ionic-framework #jwt

#node.js #angular #ionic-framework #jwt

Вопрос:

Я работаю над приложением Ionic.
С одной стороны, у меня есть базовая форма аутентификации, в которой люди заполняют свое имя пользователя и пароль. С другой стороны, я хотел бы реализовать аутентификацию с помощью веб-токенов JSON и Node JS.
Рабочий процесс будет таким: как только пользователь заполнит свои учетные данные, они будут отправлены с запросом POST. Если эти учетные данные верны, пользователь может получить доступ к приложению и получит токен доступа в качестве ответа.

Дело в том, что я немного запутался во всех этих концепциях. Я создал форму и отправил информацию с запросом POST. Мне удалось создать несколько API с помощью Node JS, и это нормально. Я также вижу, как создать аутентифицированный веб-сервис (например:https://github.com/jkasun/stack-abuse-express-jwt/blob/master/auth.js ).
Но я конкретно не понимаю связей между формой html и частью проверки авторизации..
Чтобы было понятнее, как можно заставить html-часть и JS-скрипты узла взаимодействовать вместе?

Перед публикацией этого вопроса я провел много исследований и нашел много материала по созданию аутентифицированного API. Но было очень мало советов о том, как заставить его взаимодействовать с клиентской частью (я имею в виду форму), что я и должен сделать.
Если у кого-нибудь есть какие-либо ресурсы (документ, примеры Github ..) по этому поводу, я буду очень признателен. Но я тоже был бы очень рад, если бы кто-нибудь попытался заставить меня понять эти концепции. Я думаю, мне нужно улучшить свои знания обо всем этом, чтобы я мог протестировать некоторые POCS.

Заранее большое спасибо!

Комментарии:

1. Метод Angular post или jwt auth. В чем ваша проблема

Ответ №1:

Общий поток JWT:

1- Аутентификация с использованием стратегии (вы это сделали)

2- Доставьте accessToken вместе с ответом (вы это сделали)

3- Клиент ДОЛЖЕН хранить этот accessToken (localStorage — лучшее место, а не cookies: они уязвимы для csrf-атак)

4- При каждом запросе, который вы собираетесь отправлять в защищенную область (где пользователь должен пройти аутентификацию и авторизацию), обязательно отправляйте вместе с ним accessToken, вы можете поместить его в заголовок авторизации, пользовательский заголовок, непосредственно в теле запроса… В основном просто убедитесь, что отправили это правильно.

5- На сервере, принимающем клиентские запросы, вам НЕОБХОДИМО подтвердить этот токен (вы подтверждаете его, проверяя подпись accessToken).

6- Если он авторизован, отлично, если нет, отправьте обратно ошибку HTTP Unauthorized.

Вот моя реализация, использующая accessToken в заголовке passportjs-jwt:

Клиентский код

Для сохранения токена:

 localStorage.setItem('accessToken', myAccessToken);
  

Чтобы отправить его:

 const myAccessToken = localStorage.getItem('accessToken');

{
  headers: {'Authorization', `Bearer ${myAccessToken}`}
}
  

Серверный код

1- Настройка паспорта

 passport.use('jwt', new JwtStrategy({
  jwtFromRequest: jwtPassport.ExtractJwt.fromAuthHeaderAsBearerToken(),
  secretOrKey: myAccessTokenSecret,
  passReqToCallback: true
}, (req, payload, done: (err?, user?) => void): void {
User
  .findOne({where: {id: req.params.id}})
  .then((user: User) => {

    if (!user) {
      return done(new Error(`No user found with id: ${req.params.id}`), null);
    }

    return done(null, user);
  })
  .catch((e: Error) => done(e, null));
}));
  

Обратите внимание на обратный вызов: если ваш обратный вызов вызван, это означает, что passport успешно проверил токен (он действителен). В моем примере я получаю данные пользователя в базе данных, и это пользователь, который будет возвращен и помещен в запрос.пользовательский объект передается моему контроллеру ниже:

2- Наконец, маршрут контроллера (защищенная область):

 .get('/users/:id', passport.authenticate('jwt'), (req, res, next) => {
  // do stuff in protected area.
}
  

И это все. Если вы хотите большей безопасности, проверьте реализацию refreshTokens.

Я использовал passport, потому что нашел это уместным в моем случае, но вы можете написать свой собственный обработчик, используя jsonwebtoken и просто вызывая его функцию «verify».

Вы можете найти документацию по стратегии passport jwt здесь =>http://www.passportjs.org/packages/passport-jwt

Комментарии:

1. Великий сэр, большое вам спасибо за то, что нашли время ответить. Я понимаю, о чем вы говорите, и это действительно помогает. Но остается одна вещь, которую я не понимаю.. Когда у вас в форме есть подобные вещи <ion-input autocomplete="off" type="text" name="username" [(ngModel)]="username"></ion-input> , как вы отправляете это в POST-запрос, который после обменивается данными с Node JS и JWT?

2. И, вообще говоря, как JS-узел и JWT-часть могут проверить, содержит ли отправленный POST-запрос действительные учетные данные?

3. После нескольких часов тестирования мне наконец удалось это сделать, еще раз спасибо @millenion !! В моем методе входа в систему я сохранил токен с помощью localStorage.setItem . Затем я добавляю это в свои параметры заголовков. Параметры заголовков вызываются в запросе POST. Поэтому я уполномочен отправлять данные.