Аутентификация RESTful с использованием веб-токенов Ember, Node / Express и json, как я могу проверить адреса электронной почты пользователей?

Вот мой рабочий процесс:

  1. Действие Ember при регистрации нового пользователя заключается в отправке Express пользовательских данных.
  2. Затем Express создает веб-токен, шифрует содержимое и помещает ссылку в электронное письмо, которое отправляется с помощью Nodemailer.
  3. Электронное письмо успешно отправлено.
  4. Пользователь переходит на свой адрес электронной почты и нажимает на ссылку.
  5. При нажатии на ссылку Express получает токен из параметров запроса, расшифровывает и декодирует токен и создает нового пользователя.

Все вышеперечисленное работает нормально, но вот где я застрял. Я бы хотел, чтобы пользователь был перенаправлен обратно во внешний интерфейс Ember и автоматически входил в систему. Это тот бит, на котором я застрял. Вот код сервера:

<!-- language: lang-js -->
signUpUser.save().then(function(model) {
        res.set('location', 'http://localhost:4200/login');
        res.status(302).json({user:model})
});

Я могу успешно перенаправить обратно, но я не могу захватить данные json в моем коде ember, и я не уверен, где и как в Ember я могу вызвать действие входа в систему в данном сценарии.

Я чувствую, что мой подход может быть неправильным? Потому что проверка электронной почты - обычное дело. Кроме того, я бы предпочел не заставлять пользователей вводить информацию в форму более одного раза.


person kaustubhb    schedule 06.03.2015    source источник


Ответы (2)


Вот как я это делаю:

  1. В Express добавьте параметры запроса к URL-адресу ответа после сохранения пользователя:
signUpUser.save().then(function(model) {
    res.set('location', 'http://localhost:4200/login?token=' + token + 'id=' + id);
    res.status(302).json({user:model})
});
  1. В Ember в хуке / login перед обработкой Model возьмите параметры запроса:
beforeModel: function(transition) {
    console.log(transition.queryParams.token);
    if (transition.queryParams.token) {
        this.controllerFor('login').send('assignTokenToUser', transition.queryParams.token, transition.queryParams.id);
    };

    if (!Ember.isEmpty(this.controllerFor('login').get('token'))) {
        return this.transitionTo('courses');
    }
}

Я не уверен, что это путь Ember, но главное здесь - получить queryParams объекта перехода.

person kaustubhb    schedule 06.03.2015

Не могли бы вы предоставить дополнительную информацию об используемой вами системе аутентификации? Похоже, вы используете JWT для передачи некоторой информации о проверке электронной почты, но как вы аутентифицируете запросы API? Вы используете другой JWT, который хранится в файле cookie? Если это так, вы хотите создать этот файл cookie, когда они прибудут со своим проверочным JWT.

Отказ от ответственности: я работаю в Stormpath, и у нас есть полнофункциональный рабочий процесс проверки электронной почты в нашей службе. Хотя у нас нет интеграции для Ember.js, у нас есть хороший обзор JWT и одностраничных приложений, он может быть полезен на высоком уровне: Аутентификация на основе токенов для одностраничных приложений

У нас есть интеграция с Angular, если у вас есть возможность переключить фреймворки: Stormpath AngularJS SDK

person robertjd    schedule 09.03.2015
comment
Правильно, я использую 2 разных JWT. Тот, который я использую для аутентификации запросов API. Я храню его в локальном хранилище, но недавно прочитал сообщение Stormpath о том, почему файлы cookie более безопасны. И токен попадает в заголовок авторизации при каждом запросе. Другой JWT - это тот, в который я передаю зашифрованную информацию, чтобы пользователь мог создать учетную запись нового пользователя, щелкнув ссылку в своем электронном письме. - person kaustubhb; 09.03.2015