下面是我对Node实现基于Token的身份验证的完整攻略。
基于Token的身份验证
基于Token的身份验证是一种常见的身份验证方式,是Web应用程序中比较安全和可扩展的一种身份验证方式。其主要原理是,客户端在进行登录操作时,向后端发送登录请求,后端验证成功后生成一个Token并返回给客户端,客户端将Token存储在本地,以后的每个请求都会带上这个Token,后端通过验证Token的有效性来判断用户是否已经登录。
实现方式
- 安装依赖
在node中,我们可以使用 jsonwebtoken
包来创建Token,可以使用 passport
来验证Token。
npm i jsonwebtoken passport passport-jwt
- 生成Token
在登录成功后,我们需要为用户生成一个Token。可以使用 jwt.sign()
方法来生成Token:
const jwt = require('jsonwebtoken');
const secret = 'mysecret';
const token = jwt.sign({username: 'david'}, secret);
在上面的例子中,我们使用带有一个密钥的 jwt.sign()
方法生成了一个Token。Token的第一个参数是一个包含用户信息的对象,第二个参数则是一个密钥,这个密钥应该保存在后端服务中,而不应该被泄露给任何人。生成的Token可以作为一个字符串返回给客户端。
- 验证Token
在每个请求中,客户端应该将Token作为请求的一个Header参数发送到后端服务中。我们可以使用 passport-jwt
来验证Token:
const passport = require('passport');
const passportJwt = require('passport-jwt');
const JwtStrategy = passportJwt.Strategy;
const ExtractJwt = passportJwt.ExtractJwt;
const secret = 'mysecret';
const options = {};
options.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
options.secretOrKey = secret;
passport.use(new JwtStrategy(options, (payload, done) => {
if (payload.username === 'david') {
done(null, {username: 'david'});
} else {
done(null, false);
}
}));
在上面的例子中,我们使用 ExtractJwt.fromAuthHeaderAsBearerToken()
方法从请求头中获取Token,并将Token解析成一个对象。在 passport.use()
方法中,我们定义了一个验证策略,并使用 done()
方法返回用户信息,或者返回一个false值,如果找不到相应的Token。
示例
下面是两个基于Token身份验证的示例:
示例1:登录和验证
在这个示例中,我们演示了如何使用Express框架实现基于Token的身份验证。我们将使用POST方法进行登录,使用GET方法进行身份验证。
const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const passport = require('passport');
const passportJwt = require('passport-jwt');
const JwtStrategy = passportJwt.Strategy;
const ExtractJwt = passportJwt.ExtractJwt;
const app = express();
app.use(bodyParser.json());
app.use(passport.initialize());
// 定义一个密钥
const secret = 'mysecret';
// 定义一个Mock用户
const users = [
{username: 'david', password: '123456'}
];
// 定义一个登录接口
app.post('/login', (req, res) => {
const {username, password} = req.body;
const user = users.find(user => user.username === username && user.password === password);
if (!user) {
res.status(401).send({message: '登录失败,请检查用户名和密码'});
} else {
const token = jwt.sign({username}, secret);
res.send({token});
}
});
// 定义一个验证接口
app.get('/verify', passport.authenticate('jwt', {session: false}), (req, res) => {
res.send({message: '身份验证通过'});
});
// 配置验证策略
const options = {};
options.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
options.secretOrKey = secret;
passport.use(new JwtStrategy(options, (payload, done) => {
const user = users.find(user => user.username === payload.username);
if (user) {
done(null, {username: user.username});
} else {
done(null, false);
}
}));
// 启动服务
app.listen(3000, () => {
console.log('Server started at http://localhost:3000');
});
上面的代码中定义了一个/login接口,用于登录,当登录成功后会返回一个Token;同时定义了一个/verify接口,用于验证身份。在/passport.use()方法中我们定义了一个验证策略,使用身份验证头部中必须带有Bearer Token的模式进行解码。在这里我们假设用户信息已经在后端服务中,直接通过用户名来验证Token。
示例2:使用JavaScript Fetch API进行请求
下面是一个使用JavaScript Fetch API进行请求的示例代码:
const token = localStorage.getItem('token');
fetch('http://localhost:3000/verify', {
method: 'GET',
headers: {
'Authorization': `Bearer ${token}`
}
})
.then(response => response.json())
.then(data => console.log(data));
在这个示例中,我们从浏览器的localStorage中读取Token,然后将Token添加到身份验证头部中进行请求。在服务器端,身份验证头部中的Token将被解析并且验证,如果验证通过则返回一个响应。在客户端中,我们可以使用 response.json()
方法来获取响应的JSON格式数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:node实现基于token的身份验证 - Python技术站