-
用户认证(Authentication):
- 用户认证的目的是确认请求的发起者是谁。这可以通过多种方式实现,如使用基本认证(Basic Authentication)、OAuth、OpenID Connect、JWT(JSON Web Tokens)等。
- 例如,使用
passport
这个Node.js中间件,可以轻松地为应用添加本地策略或第三方策略的认证机制。
-
权限授权(Authorization):
- 授权是在用户已经通过认证后,确定他们是否有权限执行特定的操作或访问特定的资源。这通常涉及到角色和权限的管理。
- 可以通过定义角色(如管理员、普通用户等)和权限(如读写数据库、访问特定资源等),然后根据用户的角色来限制他们的操作。
-
中间件的使用:
- 创建自定义中间件来检查用户的权限。例如,你可以创建一个中间件函数,该函数检查请求中的认证信息(如JWT),然后根据认证信息中的用户角色和权限来决定是否允许访问特定的路由或资源。
-
实现细节:
- 使用JWT进行认证和授权是Node.js中常见的做法。JWT由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。载荷中可以包含用户的识别信息和权限信息。
- 在登录时,服务器生成一个JWT并发送给客户端,客户端在每次请求时将该令牌放在HTTP头部。服务器通过验证令牌的签名来确认其有效性,并根据载荷中的信息进行授权。
- 代码:
const express = require('express'); const jwt = require('jsonwebtoken'); const app = express(); // 用于验证JWT的中间件 function authenticateToken(req, res, next) { const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (token == null) return res.sendStatus(401); // 没有提供令牌 jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, user) => { if (err) return res.sendStatus(403); // 令牌验证失败 req.user = user; next(); }); } // 受保护的路由 app.get('/protected', authenticateToken, (req, res) => { // 这里可以根据req.user中的信息进行进一步的授权检查 res.json({ message: 'You are authorized to access this information.' }); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server is running on port ${PORT}.`); });
authenticateToken
中间件用于验证请求中的JWT。如果令牌有效,用户信息将被添加到请求对象中,后续的路由处理可以访问这些信息来进行授权检查。