节点,Express REST使用JWT令牌进行身份验证



我正在使用NodeJS和Express框架创建一个博客。为了增加额外的安全性,我将Sign-Up&从应用程序登录。为此,我在PORT5000中使用Express创建了一个RESTneneneba API(仅用于受保护路由的身份验证(,实际应用程序运行在5001上。

当用户从浏览器中的登录页面张贴到"http://www.example.com:5001",即我的申请。我验证在PORT5000上运行的REST API的值。

//First user posts login data into my application
router.post('/login', async (req, res) => {
try{
let payload = {
'username': req.body.username,
'password': req.body.password,
}
//sending the parameters for authentication to PORT 5000 (i.e., REST API)
const response = await axios.post('http://www.example.com:5000/login', payload);
if(response)
{
console.log(response.data);
newToken = {
token: response.data.token,
refreshToken: response.data.refreshToken
}
res.redirect('/');
}
}
catch(err){
console.log(err);
}

})

REST API在接收到请求后进行响应。

app.post('/login', async (req, res, next) => {
try{
let token, refreshToken;
await connectDB();
let result = await findOneUser(req);
if(result)
{
//Initialize JWT Token Signature
try {
//Creating jwt token
token = jwt.sign(
{ username: req.body.username },
"secretkeyappearshere",
{ expiresIn: "1h" }
);
refreshToken = jwt.sign({ username: req.body.username },
"some-secret-refresh-token-shit",
{ expiresIn: "3h" }
);

} catch (err) {
console.log(err);
const error = new Error("Error! Something went wrong.");
return next(error);
}
}
const response = {
"status": "Logged in",
"token": token,
"refreshToken": refreshToken,
}
res.send(response);
return next(false);
}
catch(err){
console.log(err);
tokenList[refreshToken] = response
res.status(200).json(response);
next(false);
}
});

一切顺利,我在申请中收到了代币。

但是,当我重新发送令牌时,问题就开始了。假设我必须验证一条路由(比如设置路由(。我希望用户再次进行身份验证。因此,我再次将我在第一次调用REST API时收到的令牌发回,但现在我没有从API收到任何返回到应用程序的内容。

上面的第一段代码有一个名为";newtoken";,我在application.js文件中将其设置为全局。我将在第一次调用中收到的令牌存储在此变量中。现在,我使用它来发送另一个请求,以验证设置页面/路由。

所以,我在下一次通话中再次发送这个代币,就像这个一样

router.get('/settings', async (req, res) => {
let data = {
params: {
from: "2022-03-12",
to: "2022-03-13"
},
headers: {
"X-Auth-Token": newToken,
"content-type": "application/json"
}
};
try{
const call = await axios.post('http://www.example.com:5000/validate', data);
if(call){
console.log(call.data);
res.render('settings', { name: "Some test data" });
}
}
catch(err)
{
console.log(err);
}
});

正如,您可以看到我正在重新发送带有标头的令牌数据。事实上,我已经尝试过所有其他发送方式,但都不起作用。我的下一个电话没有任何回复。非常感谢您的帮助。提前谢谢。

您的router将并行处理许多请求(来自不同用户(,但全局变量newToken只存在一次,这无法工作。

您的router可以在会话cookie中向客户端(浏览器(发送令牌,也可以使用express-session并将令牌存储在req.session.token:中

// newToken = {
//   token: response.data.token,
//   refreshToken: response.data.refreshToken
// }
req.session.token = response.data.token;
req.session.refreshToken = response.data.refreshToken;

最新更新