Вам необходимо использовать пакет jsonwebtoken. Пакет express-jwt
помогает защитить часть вашего API при использовании инфраструктуры ExpressJS.
секрет много как пароль. Он кодирует полезную нагрузку, чтобы конфиденциальная информация могла быть передана в JWT без манипулирования. Это дает уверенность в том, что механизм аутентификации не был изменен, и поэтому сервер может доверять этому пользователю.
Примечание: В некоторых случаях вы увидите, что JWT закодирован с помощью алгоритма RS256. Это потребует наличия пары открытого/закрытого ключа для проверки и декодирования JWT.
Сформировать
sign()
функция делает это в jsonwebtoken
. Если вы используете пакет jwt-simple, вы будете использовать encode()
.
Вы можете подписать JWT с любым секретом, но вам придется использовать тот же секрет для использования verify()
.
Предположим, у вас есть следующий объект JSON, который вы хотите сделать JWT:
var json = { user: 'jdoe',
firstName: 'John',
lastName: 'Doe',
id: 1
};
var token = jwt.sign(json, 'superSecretSquirrel');
Подписанное/кодированный маркер теперь будет выглядеть так:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiamRvZSIsImZpcnN0TmFtZSI6IkpvaG4iLCJsYXN0TmFtZSI6IkRvZSIsImlkIjoxLCJpYXQiOjE0MzI3NjU3NzJ9.4mowMfRKIENnAKtRdDkj-BZZqAS8_b0eS3nj5qvEu9Q
Вы можете проверить это на jwt.io (убедитесь, что вы предоставили секрет, указанный здесь).
Проверка и Decode
verify()
функция делает это асинхронно. Объект, который он возвращает в обратном вызове, является декодированным JWT. Чтобы проверить JWT, вам нужно передать секрет функции.
Предполагая, что секрет «superSecretSquirrel», как показано выше:
var jwt = require('jsonwebtoken');
jwt.verify(token, 'superSecretSquirrel', function (err, decoded) {
if (err)
console.error(err);
// Show the decoded JWT
console.log(decoded);
});
Декодированный маркер будет отображаться как:
{ user: 'jdoe', firstName: 'John', lastName: 'Doe', id: 1, iat: 1432765772 }
Где iat
в маркере является registered claim, что означает «Выдано в ».
Теперь давайте обратимся к вашему примеру (я оставил свою функцию и заменить секрет):
var expressJWT = require('express-jwt');
// Assume app = express();
app.get('/protected',
expressJWT({
secret: 'superSecretSquirrel'
}),
...
);
Что это делает только разрешить доступ к пути /protected
, если у вас есть JSON веб-токен, подписанный с секретным «superSecretSquirrel». Если у вас есть токен с тайной, которая не соответствует, вы получите UnauthorizedError
, и вы захотите выбросить HTTP 401.
'express-jwt' только декодирует/проверяет токены, генерация остается таких как ['jsonwebtoken'] (https://github.com/auth0/node-jsonwebtoken). Секрет должен соответствовать тайне, с которой были созданы токены. – robertklep