2016-07-26 3 views
1

Я только что применил Json Web Tokens к моему api, но я не понимаю, как проверить, является ли пользователь, создавший токен, тем, который делает запрос.Json Web Token + User Authentication

Например, у меня есть конечная точка/user/login, и я получил имя пользователя и пароль для входа. Затем я создаю текстовый токен json с внутренними данными пользователя и возвращаю его. И вот моя проблема, откуда я знаю, что пользователь, создающий этот токен, является тем, кто делает запрос?.

Я нашел несколько способов проверить это, например, сохранить user-agent + ip пользователя и только принять запрос для этого токена, если user-agent + ip is xxx, но я не уверен, что это лучший способ.

Я надеюсь, что вы можете мне помочь с некоторыми советами,

Спасибо за все

+0

Как сказал @pedrofb, сервер выдает JWT, а не клиент. Клиент просто отправляет его по каждому запросу. –

+0

Привет @JIFT, вы проверили ответы? Помните, если один из ответов соответствует вашему вопросу, вы можете отметить его как принятый. Это необязательно – pedrofb

ответ

0

какой-либо причине вы не можете использовать стандарт как oauth2 и пусть большие мальчики справиться безопасность для вас? Роллинг вашей собственной безопасности обычно очень сложно получить правильно, и почти все основные игроки предоставляют бесплатную поддержку OATH.

Это говорит о том, что я не решаюсь вести вас по плохой дороге, однако я был на вашем месте раньше, поэтому, если вы должны бросить свою собственную безопасность, убедитесь, что вы полностью прочитали все, что может предложить OWASP , Они предлагают очень подробный анализ угроз, а также дают предложения, которые будут неоценимы в ходе вашего путешествия.

OWASP Threat Analysis

EDIT 1

Хороший легкий вес и легко реализовать стандарт является OpenID, который, как объясняет их баннер,

Простой Идентичность слой поверх OAuth 2.0

См. Здесь за очень подробное объяснение того, как это работает: OpenID-Wiki

+0

Привет, Джозеф, на этой неделе я реализовал эту библиотеку OAUTH https://bshaffer.github.io/oauth2-server-php-docs/, но это заставляет меня создавать множество таблиц, и я действительно не понимаю почему, потому что это api для веб-сайта и приложения, и я думаю, что мне не нужно все это. Но может быть, я ошибаюсь. Было бы неплохо, если бы вы могли указать поток, который вы использовали бы с OAUTH для проверки входа. – JIFT

+0

Я отредактировал ответ, чтобы предложить OpenID. Кроме того, причиной столь большого количества таблиц является то, что вы устанавливаете сервер OAUTH2. Если вы абсолютно не хотите контролировать членство, вы этого не хотите. Вместо этого вы хотите зарегистрировать свое приложение у известного поставщика и использовать свою услугу (пусть они сортируют головную боль). Есть много ресурсов, но я бы начал с программы OpenID и отработал оттуда. –

+0

Ничего себе, это выглядит действительно здорово, но его платят. Я ищу менее благоприятную альтернативу для развития себя, потому что это мой собственный проект не для компании, в которой я работаю. – JIFT

1

как я знаю, что пользователь, создать этот маркер, это тот, который делает запрос?.

Поскольку JWT включает в себя идентификатор пользователя и подписан, поэтому любые изменения в содержимом будут обнаружены.Обладание знака является доказательством подлинности

Процесс выдачи и аутентификации с JWT, более или менее, как этот

выпуском нового JWT

  1. выполняет и аутентификацию пользователя с помощью своих учетных данных

  2. Сервер проверяет учетные данные, генерирует полезную нагрузку JWT, включая данные пользователя, и некоторые поля, такие как истечение ti меня или эмитента, и подписывает токен с закрытым ключом сервера

  3. Клиент получает токен и сохраняет его (в защищенном хранилище).

Authentication

  1. Пользователь отправляет запрос на сервер. Запрос включает JWT, обычно в заголовках или как url ​​param

  2. Сервер проверяет подпись ключом и извлекает идентификатор пользователя, чтобы узнать запрашивающего. Если подпись недействительна, отклоняет запрос

+0

Спасибо за ответ @pedrofb, то есть поток, который я фактически использую, но, например, какое «безопасное хранилище» вы бы порекомендовали?, Например, переменная сеанса или cookie?. И я хотел бы добавить дополнительную безопасность таким же образом, чтобы проверить, что идентификатор пользователя из этого токена является тем, который делает запрос. – JIFT

+0

Вы можете использовать localStorage, sessionStorage и файлы cookie. Посмотрите на сравнение здесь https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage. localStorage уязвим для атак XSS, куки-файлы уязвимы для CSRF, поэтому вам понадобится токен CSRF, добавленный в JWT. Также вы можете защитить файлы cookie с помощью HttpOnly, если вам не нужно читать содержимое JWT на стороне клиента. Решите сами по себе, как вам нужно :) – pedrofb

+0

UserId находится в поле 'sub' JWT. Вы должны добавить дополнительную меру безопасности, если вы хотите, чтобы JWT не использовалась для полной проверки подлинности. Например, требуется JWT и токен безопасности CSRF, выпущенный ранее. Другой альтернативой является использование пары криптографических ключей, сгенерированной на стороне клиента, и требовать от клиента подписи над полезной нагрузкой запроса. Сервер будет проверять подпись с помощью открытого ключа (связанного с учетной записью пользователя). Но этот вариант сложнее реализовать – pedrofb