Поддержание секретного ключа и токена доступа для JWT в Express и NodeJS с помощью Facebook в Rest API

У меня есть два приложения:

  • сервер (сервер API REST)
    • node js
    • Экспресс
    • jsonwebtokens
    • экспресс-JWT
    • мангуст
  • клиент (Portable Front-end)
    • bootstrap
    • Angular JS
    • локального хранения
    • angular -facebook
    • angular -jwt

Позже клиентское приложение будет перенесено на Android, iphone и другие платформы, используя телефонную рассылку. Для OAuth я использую Facebook в качестве поставщика. Теперь я просто понял, что JSON Web Tokens - это способ пойти на такой настрой. Мой вопрос является скорее архитектурным, чем синтаксическим - как управлять секретным ключом при подписании токена доступа к facebook и идентификатора пользователя с помощью JWT в nodejs?

Таким образом, поток работает в моем приложении:

  • Angular клиент имеет кнопку входа
  • Пользователь нажимает кнопку > Facebook Auth начинает
  • Клиент получает user_id и токен FB Access
  • Клиент отправляет [POST json body] как user_id, так и токен доступа на Node + Экспресс-сервер на http://server.com/auth/login
  • node Сервер применил express-jwt для всех маршрутов, кроме /auth/login, с

    var expressJwt = require ('express-jwt');

    var jwt = require ('jsonwebtoken');

    app.use(expressjwt ({secret: ''}). if ({path: ['/auth/login']}));

  • node сервер получает данные из req.body, извлекает все данные профиля из facebook с помощью JavascriptSDK и подписывает его с помощью

    var token = expressjwt.sign({profile},);

  • node Сервер хранит (обновления, если существует user_id) новый токен в db и отправляет его как ответ клиенту
  • клиент сохраняет новый токен, полученный в виде json-данных в локальном хранилище
  • клиент использует angular -jwt для извлечения данных профиля из нового токена и автоматического присоединения нового токена в заголовке авторизации для всех запросов, которые он отправляет на сервер

Теперь мои вопросы:

  • Нужно ли мне хранить маркеры JWT в базе данных? Я, конечно, не сравниваю токены в заголовках запросов с базой данных
  • Нужно ли мне генерировать случайные секретные ключи для обеспечения безопасности каждый раз, когда пользователь входит в систему? Если да, то как это будет соответствовать как клиенту, так и серверу?
  • Когда и где мне нужно проверить срок действия токена? и как его обновить?

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

Ответы

Ответ 1

Объявление 1. Вам не нужно хранить JWT в базе данных. Идентификатор пользователя может быть частью полезной нагрузки, поэтому нет необходимости в нем.

Объявление 2. Это обычная практика для приложения на стороне сервера использовать один секретный ключ для генерации всех JWT.

Объявление 3. Проверьте, истек ли токен по каждому запросу в ваш API и запрет доступа, если токен истек, верните код состояния 401. Клиентское приложение должно запрашивать у пользователя учетные данные и запрашивать новый JWT. Если вы хотите, чтобы пользователи не переписывали учетные данные, вы можете выпустить токен обновления, который позже может быть использован для генерации нового JWT.

JWT обновить токен токена

http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/