Node登录权限验证token验证是一种常用的用户认证方式。下面是实现这种验证的方法示例:
1. 生成Token
在编写代码之前,需要首先使用node.js的jsonwebtoken模块生成一个Token字符串。示例代码如下:
const jwt = require('jsonwebtoken');
// 生成Token的函数
function generateToken(user) {
const payload = {
sub: user.id,
iat: Date.now()
};
const options = {
expiresIn: '24h'
};
const secret = 'ThisIsASampleSecretKey';
return jwt.sign(payload, secret, options);
}
在这个例子中,generateToken函数接收一个用户对象user,通过使用jsonwebtoken生成一个JWT Token字符串。这个函数使用了一个SecretKey,SecretKey是一个可以保证Token字符串安全的唯一密钥,因此需要在生成Token的时候设置一个SecretKey。
2. 校验Token
代码中有一个需要保证的功能是登录用户后的请求只有拥有有效Token的用户才可以访问。下面是一个示例,该示例代码用于校验Token的有效性:
const jwt = require('jsonwebtoken');
// 安全验证中间件函数,用于校验Token的有效性
function verifyToken(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.sendStatus(401);
}
const token = authHeader.split(' ')[1];
jwt.verify(token, 'ThisIsASampleSecretKey', (err, user) => {
if (err) {
return res.sendStatus(403);
}
req.user = user;
next();
});
}
这个中间件函数用于校验Token的有效性,首先要从请求头中提取Token字符串。如果请求头中没有Authorization字段或者无效,则返回状态码401,表示访问被拒绝。如果Token字符串能够被提取,那么使用jsonwebtoken的verify函数进行Token验证。由于校验Token的函数是一个异步函数,所以使用了回调函数来处理验证结果,如果Token无效则返回状态码403。如果Token是有效的,则请求对象req将存储用户对象user,该对象可以被传递到下一个处理程序。
3. 示例说明
以下是两个示例说明,用于演示如何在Express.js框架中实现这种Token验证方式。
示例1
const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
const secret = 'ThisIsASampleSecretKey';
// 安全验证中间件函数,用于校验Token的有效性
function verifyToken(req, res, next) {
const authHeader = req.headers.authorization;
if (!authHeader) {
return res.sendStatus(401);
}
const token = authHeader.split(' ')[1];
jwt.verify(token, secret, (err, user) => {
if (err) {
return res.sendStatus(403);
}
req.user = user;
next();
});
}
// 模拟用户登录接口
app.post('/login', (req, res) => {
// 此处省略验证用户登录信息的代码
const user = { id: 1, username: 'testuser' };
const token = jwt.sign({ sub: user.id }, secret, { expiresIn: '24h' });
res.json({ token });
});
// 需要进行安全验证的API接口
app.get('/api/posts', verifyToken, (req, res) => {
res.json({ message: '您已登录用户' });
});
// 在本地启动服务器
app.listen(port, () => {
console.log(`Server started at http://localhost:${port}`);
});
在这个示例中,首先是一个/post/login路由,用于用户登录。当用户通过POST /login路由提交登录凭证时,应用程序将检查用户凭证,并如果凭证通过验证,则使用jsonwebtoken模块生成一个Token,并将Token返回给客户端。
其次,还有一个/api/posts路由,用于对请求进行安全验证。当没有有效的Token或者Token不正确时,该路由将会返回403状态码。如果Token正确,则返回一个JSON字符串。
示例2
另一个示例是在Express.js应用程序中使用jsonwebtoken模块的更直接的实现。以下代码片段演示了如何在Express.js应用程序中使用jsonwebtoken模块。
const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();
// 安全验证中间件函数,用于校验Token的有效性
function verifyToken(req, res, next) {
const token = req.headers['x-access-token'];
if (!token) {
return res.status(403).send({
message: '请提供有效Token'
});
}
jwt.verify(token, config.secret, (err, user) => {
if (err) {
return res.status(401).send({
message: 'Token无效,请重新登录'
});
}
req.user = user;
next();
});
};
// 用于验证用户登录的路由
app.post('/api/login', (req, res) => {
const {username, password} = req.body;
const user = {
id: 1,
username,
password
};
// 用户凭证验证省略
const token = jwt.sign({ id: user.id }, config.secret, {
expiresIn: 86400 // 24小时过期时间
});
res.status(200).send({
auth: true,
token
});
});
// 需要进行安全验证的API
app.get('/api/user', verifyToken, (req, res) => {
res.status(200).send(req.user);
});
// 在本地启动服务器
app.listen(3000, () => {
console.log('Server running on port 3000');
});
在这个示例中,取代了调用verifyToken的中间件函数。在路由中直接使用verify函数进行身份验证,并返回相应的状态码。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node登录权限验证token验证实现的方法示例 - Python技术站