📅  最后修改于: 2023-12-03 15:21:39.504000             🧑  作者: Mango
Web 身份验证是 Web 应用程序的必要组成部分,它确保只有被授权的用户才能访问受到保护的资源。在本文中,我们将了解 Web 身份验证的基础知识和如何在 Web 应用程序中实现身份验证。
身份验证是确认用户身份的过程。在 Web 应用程序中,身份验证通常发生在用户登录时。用户输入用户名和密码后,Web 应用程序使用验证机制验证他们提供的凭据是否正确。一旦确认用户的身份,他们就可以访问受保护的资源,例如需要登录才能访问的页面或数据。
基于表单的身份验证是 Web 应用程序中最常见的身份验证方法。在这种方法中,用户在 Web 应用程序的登录页面输入他们的凭据(通常是用户名和密码),这些凭据被提交到服务器进行验证。如果验证通过,则用户被授权访问受保护的资源。
登录表单示例:
<form action="/login" method="POST">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit" value="Login">
</form>
基于令牌的身份验证是另一种常见的身份验证方法。在这种方法中,用户在登录后接收到一个令牌,该令牌用于以后的身份验证。令牌通常是长字符串,可保存在 Cookie 中或使用浏览器的 LocalStorage 存储。
身份验证令牌示例:
// 生成令牌
const token = jwt.sign({ username: 'alice' }, 'secret');
// 存储令牌
localStorage.setItem('token', token);
// 获取令牌
const token = localStorage.getItem('token');
// 解密令牌
const decoded = jwt.verify(token, 'secret');
基于证书的身份验证是一种较少使用的身份验证方法,它使用公共密钥证书和私有密钥证书来验证用户身份。在这种方法中,用户需要安装浏览器插件或操作系统证书仓库中的证书。
Web 应用程序可以使用许多框架和库来实现身份验证。在这里,我们将介绍两个常用的身份验证库:Passport 和 jwt。
Passport 是一个流行的 Node.js 身份验证库,它支持多种身份验证策略,包括基于表单的身份验证和基于令牌的身份验证。
使用 NPM 安装 Passport:
npm install passport
在应用程序中配置 Passport:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
if (!user.verifyPassword(password)) { return done(null, false); }
return done(null, user);
});
}
));
app.use(passport.initialize());
使用 Passport 登录:
app.post('/login',
passport.authenticate('local', { failureRedirect: '/login', failureFlash: true }),
function(req, res) {
res.redirect('/');
});
JSON Web Token(JWT)是一种基于令牌的身份验证方法,它使用 JSON 对象作为令牌。JWT 令牌通常包含一些元数据和用户 ID。
使用 NPM 安装 jwt:
npm install jsonwebtoken
在服务器端生成 jwt 令牌:
const jwt = require('jsonwebtoken');
const token = jwt.sign({ id: user.id }, 'secret', { expiresIn: '1h' });
res.cookie('token', token);
res.redirect('/');
使用 jwt 验证令牌:
const jwt = require('jsonwebtoken');
router.get('/', function(req, res, next) {
const token = req.cookies.token;
jwt.verify(token, 'secret', function(err, decoded) {
if (err) {
res.redirect('/login');
return;
}
const user = User.findOne({ id: decoded.id });
res.render('index', { user });
});
});
身份验证是 Web 应用程序的必要组成部分。在本文中,我们了解了身份验证的基本概念和常见的身份验证方法。我们还介绍了两个常见的身份验证库(Passport 和 jwt)和如何在应用程序中使用它们来实现身份验证。