Автор оригинала: Anthony Gore.
Вы, вероятно, слышали, что Web Token JSON (JWT) – это современные современные технологии для защиты API.
Как и большинство тем безопасности, важно понять, как это работает (по крайней мере, несколько), если вы планируете использовать его. Проблема в том, что большинство объяснений JWT являются технические и головные боли.
Давайте посмотрим, смогу ли я объяснить, как JWT может защитить ваш API, не пересекая глаза!
Аутентификация API
Некоторые ресурсы API нуждаются в ограниченном доступе Отказ Мы не хотим, чтобы один пользователь мог изменить пароль другого пользователя, например.
Вот почему мы защищаем определенные ресурсы, сделаем пользователям поставлять их идентификатор и пароль, прежде чем разрешить доступ – другими словами, мы их аутентифицируем.
Трудность в обеспечении HTTP API является то, что запросы являются без гражданства – API не имеет способа узнать, были ли два запроса от одного пользователя или нет.
Так почему же нам не требуют пользователей предоставлять свой идентификатор и пароль на каждый вызов на API? Только потому, что это будет ужасный пользовательский опыт.
JSON WEB TOKEN
Что нам нужно, это способ разрешить пользователю предоставлять свои учетные данные только один раз, но затем быть идентифицированным другим способом сервером в последующих запросах.
Несколько систем были разработаны для этого, а текущий современный стандарт – это токен JSON.
Есть Отличная статья по теме Что делает хорошую аналогию о том, как работает JSON Web Tookens:
Вместо API представьте, что вы проверяете в отеле. «TOKEN» – это пластичная карта безопасности отеля, которая позволяет вам получить доступ к вашей комнате и удобствам отеля, но не кто-то другой.
Когда вы выезжаете из отеля, вы даете карту обратно. Это аналогично вытеснению.
Структура токена
Обычно веб-токен JSON отправляется через заголовок HTTP-запросов. Вот что похоже:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Фактически, токен является частью «Авторизация: Negerer», которая является просто информацией заголовка HTTP.
Прежде чем вы заключите, что это непонятный гибберский, есть несколько вещей, которые вы можете легко заметить.
Во-первых, токен состоит из трех разных струн, разделенных периодом. Эти три строки – База 64 закодирована и соответствовать Заголовок , полезная нагрузка и Подпись Отказ
// Header eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
// Payload eyJzdWIiOiIxMjM0NTY3ODkwIn0
// Signature dozjgNryP4J3jVmNHl0w5N_XgL0n3I9PlFUP0THsR8U
Примечание. База 64 – это способ преобразования строк, чтобы убедиться, что они не прикручены во время транспортировки по всей сети. Это не своего рода шифрование, и кто-нибудь может легко декодировать это Чтобы увидеть исходные данные.
Мы можем декодировать эти строки, чтобы лучше понять структуру JWT.
Заголовок
Ниже приведен декодированный заголовок из токена. Заголовок – мета-информация о токене. Это не говорит нам много, чтобы помочь построить наше основное понимание, поэтому мы не будем получать информацию об этом.
{ "alg": "HS256", "typ": "JWT" }
Полезная нагрузка
Полезная нагрузка гораздо больше интереса. Полезная нагрузка может включать любые данные, которые вам нравятся, но вы можете просто включить идентификатор пользователя, если цель вашего токена является аутентификация API Access.
{ "userId": "1234567890" }
Важно отметить, что полезная нагрузка не безопасна Отказ Любой может декодировать токен и увидеть именно то, что в полезной нагрузке. По этой причине мы обычно включаем идентификатор, а не чувствительную идентифицирующую информацию, такой как адрес электронной почты пользователя.
Несмотря на то, что эта полезная нагрузка – это все, что необходимо для идентификации пользователя на API, он не предоставляет средства аутентификации. Кто-то могло легко найти свой идентификатор пользователя и подвести токен, если это все, что было включено.
Так что это приводит нас к подписи, которая является ключевой частью для аутентификации токена.
Альгоритмы хеширования
Прежде чем мы объясним, как работает подпись, нам нужно определить, что такое алгоритм хеширования.
Для начала это функция для преобразования строки в новую строку под названием A хеш Отказ Например, скажем, мы хотели бы хэш строку «Привет, мир». Вот вывод, который мы получили с использованием алгоритма хеширования SHA256:
4ae7c3b6ac0beff671efa8cf57386151c06e58ca53a78d83f36107316cec125f
Самое важное свойство хеша в том, что Вы не можете использовать алгоритм хеширования, чтобы определить исходную строку, глядя на хэш Отказ
Существует много разных типов алгоритмов хеширования, но SHA256 обычно используется с JWT.
Другими словами, мы не может Примите вышеупомянутые хеш и напрямую выясните, что исходная строка была «Hello, World». Хеш достаточно сложный, что угадывание исходная строка была бы неосуществимой.
JWT подпись
Так что возвращаясь к структуре JWT, давайте теперь посмотрим на третий кусок токена, подпись. На самом деле это необходимо рассчитать:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), "secret string" );
Вот объяснение того, что происходит здесь:
Во-первых, Hmacsha256
это название функции хеширования и принимает два аргумента; Строка к хэш и «секретно» (определено ниже).
Во-вторых, строка, которую мы HASHH – это кодированный кодированный заголовок основания 64, а также базовый 64 закодирована полезная нагрузка.
В-третьих, секрет является произвольным произведением данных, которые Только сервер знает Отказ
В. Почему включают заголовок и полезную нагрузку в хэш подписи?
Это гарантирует, что подпись уникальна для этого конкретного токена.
В. Что такое секрет?
Чтобы ответить на это, давайте подумаем о том, как вы будете собираться токен.
Мы сказали, что вы не можете определить вход HASH от поиска на выходе. Однако, поскольку мы знаем, что подпись включает в себя заголовок и полезную нагрузку, так как это являются общедоступными информацией, если вы знаете алгоритм хеширования (подсказка: он обычно указывается в заголовке), вы можете генерировать то же самое хэш.
Но секрет, который знает только сервер, это не публичная информация. Включая его в хеш, мешает кому-то генерировать свой собственный хеш, чтобы подвести токен. И поскольку хэш скрывает информацию, используемую для ее создания, никто не может выяснить секрет от хеша.
Процесс добавления личных данных на хеш называется Солнение И делает растрескивание токен почти невозможно.
Процесс аутентификации
Так что теперь у вас хорошее представление о том, как создан токен. Как вы используете его для аутентификации вашего API?
Авторизоваться
Токен генерируется, когда пользователь входит в систему и сохраняется в базе данных с помощью модели пользователя.
logincontroller.js.
if (passwordCorrect) { user.token = generateToken(user.id); user.save(); }
Токен затем привязан как Авторизация
Заголовок в ответ на запрос в систему.
logincontroller.js.
if (passwordCorrect) { user.token = generateToken(user.id); user.save(); res.headers("authorization", `Bearer ${token}`).send(); }
Аутентификация запросов
Теперь, когда у клиента есть токен, они могут прикрепить его к любым будущим запросам на аутентично идентифицировать пользователя.
Когда сервер получает запрос с прикрепленным токеном авторизации, происходит следующее:
- Он декодирует токен и извлекает идентификатор из полезной нагрузки.
- Он смотрит на пользователя в базе данных с этим идентификатором.
- Это сравнивает токен запроса с тем, который хранится с моделью пользователя. Если они совпадают, пользователь аутентифицируется.
authmiddleware.js.
const token = req.header.token; const payload = decodeToken(token); const user = User.findById(payload.id); if (user.token = token) { // Authorized } else { // Unauthorized }
Выход из строя
Если пользователь выходит из системы, просто удалите токен, прикрепленный к модели пользователя, и теперь токен больше не будет работать. Пользователь должен снова войти в систему, чтобы создать новый токен.
logoutcontroller.js.
user.token = null; user.save();
Заворачивать
Так что это очень базовое объяснение того, как вы можете защитить API, используя JSON Web Tokens. Я надеюсь, что ваша голова не повредит слишком сильно.
Это гораздо больше к этой теме, хотя, поэтому вот несколько дополнительных чтений:
Стать старшим Vue Developer в 2020 году.
Учитесь и осваивайте, какие профессионалы знают о строительстве, тестировании и развертывании, полностью стековых Vue Apps в нашем последнем курсе.
Учить больше