Хорошо, есть несколько вещей, которые вам нужно сделать при использовании JWT, чтобы сделать его более надежным и безопасным.
Самое главное, вы не должны использовать tokenKey111
как секрет (это не очень секретно) или что-то подобное. Используйте пары открытого и закрытого ключей, чтобы сделать его безопасным.
В любом случае, поскольку вы не упомянули имя пакета, которое вы используете, я бы порекомендовал вам использовать - jsonwebtoken
в качестве пакета jwt, я нашел его лучше, чем многие другие доступные там.
Вот услуга JWT.js
:
// FileName = JWT.js
const fs = require('fs'); // to read keys
const path = require('path'); // to conveniently get paths
const jwt = require('jsonwebtoken'); // JWT provider
// use 'utf8' to get string instead of byte array
var privateKEY = fs.readFileSync(path.normalize( path.join(__dirname, '/private.key')), 'utf8');
var publicKEY = fs.readFileSync(path.normalize( path.join(__dirname, '/public.key')), 'utf8');
module.exports = {
sign: (payload, $Options) => {
/*
sOptions = {
issuer: "Authorizaxtion/Resource/This server",
subject: "iam@user.me",
audience: "Client_Identity" // this should be provided by client
}
*/
// Token signing options
var signOptions = {
issuer: $Options.issuer || "SomeOrg.inc",
subject: $Options.subject,
audience: $Options.audience,
expiresIn: "30d", // 30 days validity
algorithm: "RS256" // RSASSA options[ "RS256", "RS384", "RS512" ]
};
return jwt.sign(payload, privateKEY, signOptions);
},
verify: (token, $Option) => {
/*
vOption = {
issuer: "Authorization/Resource/This server",
subject: "iam@user.me",
audience: "Client_Identity" // this should be provided by client
}
*/
var decoded = jwt.decode(token, {complete: true});
if(decoded === null){
return false;
}
var verifyOptions = {
issuer: $Option.issuer || "SomeOrg.inc",
subject: $Option.subject || decoded.payload.sub,
audience: $Option.audience || 'false',
expiresIn: "30d",
algorithm: ["RS256"]
};
try{
return jwt.verify(token, publicKEY, verifyOptions);
}catch(err){
return false;
}
},
decode: (token) => {
return jwt.decode(token, {complete: true});
}
}
Ну, это сервис, который вы можете использовать, но чтобы он работал, вам также необходимо внести некоторые изменения в код вашего Login API.
Ваша середина должна быть примерно такой
var JWT = require('fileLocation/JWT.js');
app.use(function(req, res, next){
// considering 'client_id' and 'Token' is passed in header
if(!req.get('client_id')){
res.status(400);
return res.json({msg:"Error! Client identification missing."});
}
if(!req.get('Token')){
res.status(403);
return res.json({msg: "Error! User authentication failed."})
}
if(!JWT.verify(req.get('Token'),{audience: req.get('client_id')})){
res.status(403);
return res.json({msg: "Error! User authentication failed."})
}
next()
})
Спасибо