网站首页 > 技术文章 正文
登录鉴权是 Web 应用中非常重要的一环,常见的三种鉴权方式是 token、JWT 和 session,下面对它们进行实战分享。
1:Token 鉴权
Token 鉴权是基于 Token 的一种鉴权方式,通常使用 RESTful API 来进行数据交互。以下是一个简单的实现示例:
前端代码:
javascriptCopy codefetch('/api/login', {
method: 'POST',
body: JSON.stringify({
username: 'user',
password: 'password'
}),
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => {
localStorage.setItem('token', data.token);
})
.catch(error => console.error(error));
后端代码:
javascriptCopy codeconst jwt = require('jsonwebtoken');
const express = require('express');
const app = express();
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
if (username === 'user' && password === 'password') {
const token = jwt.sign({ username }, 'secretKey', { expiresIn: '1h' });
res.json({ token });
} else {
res.status(401).json({ error: 'Unauthorized' });
}
});
app.get('/api/data', (req, res) => {
const token = req.headers.authorization.split(' ')[1];
jwt.verify(token, 'secretKey', (err, decoded) => {
if (err) {
res.status(401).json({ error: 'Unauthorized' });
} else {
res.json({ data: 'Data accessed with Token' });
}
});
});
app.listen(3000, () => console.log('Server started'));
2:JWT 鉴权
JWT 鉴权是基于 JWT(JSON Web Token)的一种鉴权方式,它可以将用户信息加密成一个 Token,用于验证用户身份。以下是一个简单的实现示例:
前端代码:
javascriptCopy codefetch('/api/login', {
method: 'POST',
body: JSON.stringify({
username: 'user',
password: 'password'
}),
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => {
localStorage.setItem('jwtToken', data.jwtToken);
})
.catch(error => console.error(error));
后端代码:
javascriptCopy codeconst jwt = require('jsonwebtoken');
const express = require('express');
const app = express();
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
if (username === 'user' && password === 'password') {
const payload = { username };
const jwtToken = jwt.sign(payload, 'secretKey', { expiresIn: '1h' });
res.json({ jwtToken });
} else {
res.status(401).json({ error: 'Unauthorized' });
}
});
app.get('/api/data', (req, res) => {
const jwtToken = req.headers.authorization.split(' ')[1];
jwt.verify(jwtToken, 'secretKey', (err, decoded) => {
if (err) {
res.status(401).json({ error: 'Unauthorized' });
} else {
res.json({ data: 'Data accessed with JWT' });
}
});
});
app.listen(3000, () => console.log('Server started'));
3:Session 鉴权
Session 鉴权是通过在服务端保存用户的会话信息来验证用户身份,它通常与 Cookie 配合使用。以下是一个简单的实现示例:
前端代码:
javascriptCopy codefetch('/api/login', {
method: 'POST',
body: JSON.stringify({
username: 'user',
password: 'password'
}),
headers: {
'Content-Type': 'application/json'
}
})
.then(response => response.json())
.then(data => {
document.cookie = `sessionId=${data.sessionId}`;
})
.catch(error => console.error(error));
后端代码:
phpCopy codeconst express = require('express');
const session = require('express-session');
const app = express();
app.use(session({
secret: 'secretKey',
resave: false,
saveUninitialized: false,
cookie: { secure: true }
}));
app.post('/api/login', (req, res) => {
const { username, password } = req.body;
if (username === 'user' && password === 'password') {
req.session.user = { username };
res.json({ sessionId: req.session.id });
} else {
res.status(401).json({ error: 'Unauthorized' });
}
});
app.get('/api/data', (req, res) => {
if (req.session.user) {
res.json({ data: 'Data accessed with Session' });
} else {
res.status(401).json({ error: 'Unauthorized' });
}
});
app.listen(3000, () => console.log('Server started'));
这三种鉴权方式各有优缺点,需要根据实际情况进行选择。Token 鉴权可以在分布式环境中实现跨域身份验证,JWT 鉴权可以将用户信息加密并储存在 Token 中,Session 鉴权则需要在服务端保存用户会话信息,同时需要使用 Cookie 进行数据传输。
三种鉴权方式的特点总结如下:
1:Token 鉴权
优点:
- 无状态,易于扩展
- 跨域适用
- 可以适用于多个客户端,如 Web 和移动应用
缺点:
- Token 可能被窃取,需要采取措施保证安全性
2:JWT 鉴权
优点:
- 可以将用户信息加密储存在 Token 中,提高安全性
- 不需要在服务端保存会话信息,减轻服务端负担
- 跨域适用
缺点:
- Token 大小可能会较大
- Token 无法在服务端主动删除,需要等待 Token 过期
3:Session 鉴权
优点:
- 可以在服务端保存会话信息,提供更多的控制
- 对于 Web 应用来说,可以通过 HttpOnly 属性防止 XSS 攻击
缺点:
- 会话信息需要保存在服务端,占用内存
- 不适用于多个客户端,如移动应用
综上所述,每种鉴权方式都有自己的优缺点,开发人员需要根据实际情况进行选择和应用。在选择鉴权方式时需要考虑安全性、可扩展性、易用性等方面的因素。
除了选择合适的鉴权方式外,还需要采取其他措施来保证接口的安全性。以下是一些保证接口安全的建议:
1:使用 HTTPS
使用 HTTPS 可以加密数据传输,防止敏感信息在传输过程中被窃取或篡改。HTTPS 也可以保证请求和响应的完整性。
2:防止 CSRF 攻击
CSRF(Cross-Site Request Forgery)攻击是一种常见的攻击方式,攻击者利用用户已经登录过的凭证来发起伪造请求,诱导用户执行某些操作。为了防止 CSRF 攻击,可以在服务器端对请求进行验证,如使用 CSRF Token。
3:防止 XSS 攻击
XSS(Cross-Site Scripting)攻击是一种常见的攻击方式,攻击者通过在页面中注入恶意代码,诱导用户执行某些操作。为了防止 XSS 攻击,可以在服务器端对输入进行过滤和验证,并在输出时进行编码。
4:对敏感数据进行加密
对于一些敏感的数据,如用户密码等,需要进行加密存储。密码应该使用密码学安全算法进行加密,如 bcrypt、PBKDF2 等。
5:控制接口访问权限
对于不同的用户,可能需要设置不同的接口访问权限。可以在服务器端对用户进行身份验证,并根据用户的身份和权限判断是否允许访问接口。
总之,保证接口的安全性需要采取多种措施,包括选择合适的鉴权方式、使用 HTTPS、防止 CSRF 攻击和 XSS 攻击、对敏感数据进行加密等。只有综合运用这些技术手段,才能保证接口的安全性。
猜你喜欢
- 2024-09-21 Nginx鉴权,验证token(nginx 鉴权)
- 2024-09-21 干货:JWT实现token认证详解(jwt token refreshtoken)
- 2024-09-21 借助自身平台,我们用两个小时完成了新项目的用户系统
- 2024-09-21 Hutool的JWT的用法(hutool的dateutil工具类)
- 2024-09-21 springboot-如何使用shiro+jwt实现认证授权
- 2024-09-21 带你搞懂,为什么淘宝京东等使用不需要每次都登录?
- 2024-09-21 浅谈JWT ( JSON Web Token)(浅谈如何做好幼小衔接的论文)
- 1514℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 568℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 509℃MySQL service启动脚本浅析(r12笔记第59天)
- 486℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 485℃启用MySQL查询缓存(mysql8.0查询缓存)
- 466℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 446℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 443℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)