RESTful API 是一种基于 HTTP 协议的 Web API 设计风格,能够支持不同的客户端(如 Web、移动)进行数据交换,便于多平台之间的资源共享和互通。但是,由于 API 的开放性,其引入了安全问题,包括身份认证、授权等。因此,在设计和实现 RESTful API 时,需要考虑如何保证数据的安全性和可靠性。本文将会介绍 RESTful API 中的身份认证技术与实践。
何为身份认证
身份认证是指确认一个用户是否是其宣称的身份的过程。在 RESTful API 中,身份认证通常是指用户提供的访问令牌(token)与系统存储的访问令牌一致,表示用户是合法的访问者。如果访问令牌不正确或不存在,那么用户的请求将会被拒绝,并返回错误的响应信息。
常见的身份认证方式
- 基本认证(Basic Authentication)
基本认证是一种最常见的身份认证方式,其基本原理是在 HTTP 请求的请求头中添加 Authorization 字段,并将用户名和密码的组合加密后作为值保存到该字段中。如下面的示例代码:
const base64Encoded = Buffer.from(`${username}:${password}`).toString('base64');
headers: { 'Authorization': `Basic ${base64Encoded}` };由于用户名和密码是明文传输的,因此基本认证不安全,易受到网络攻击。
- 摘要认证(Digest Authentication)
摘要认证是基本认证的改进版本,其核心思想是避免用户密码在互联网上传输明文的问题。在摘要认证中,客户端向服务器发送一个随机值(nonce),服务器收到后将该随机值与当前的时间戳结合,生成一个随机数(realm)。然后,服务器将 realm 值与客户端随机值(nonce)、请求方式、URI、以及客户端用户名和密码(加密后)生成一个摘要值,将摘要值返回给客户端。客户端对该摘要值进行加密(hash),然后回传给服务器,服务器使用同样的方式加密,并进行比较,确认是否相等。示例代码如下:
const credentials = { username, password };
const auth = request('www.example.com/authenticate', credentials);
const credentialsDigest = md5(`${username}: ${auth.nonce}: ${password}`); // 生成摘要值
const authHeader = `Digest username="${username}", realm="${auth.realm}", nonce="${auth.nonce}", uri="/test", response="${credentialsDigest}"`;
headers: { 'Authorization': authHeader };虽然摘要认证避免了明文传输密码的风险,但是它仍然有加密算法的弱点,容易受到中间人攻击。
- Token 认证
Token 认证是一种目前最流行的认证方式之一,其基本流程如下:
- 用户登录后,服务器生成一个唯一的 Token,将它返回给客户端。
- 客户端将 Token 存储在本地,每次向服务器发起请求时,将 Token 附在请求头中。
- 服务器收到请求后,解析 Token 中包含的信息,检查该 Token 是否合法。
Token 认证相对于前两种认证方式,更为安全、灵活,应用范围更广泛。示例代码如下:
const token = 'I2YxrTrhr/kkFTU6JQNlzZVpUcAwbN';
headers: { 'Authorization': `Bearer ${token}` };在设计 Token 时,需要注意以下几点:
- Token 应该具有一定的时效性,避免长时间未使用的 Token 存在攻击风险。
- Token 应该加密存储,以保证生成 Token 的算法和密钥不会被泄漏。
- Token 需要存储在安全的地方,例如使用 Cookie、LocalStorage 或 Session Storage 进行保存。
身份认证实践
在实践中,需要考虑到具体业务需求和安全性要求,选择最适合的身份认证方式。具体来讲,可以参照以下建议:
- 应用 HTTPS 协议
HTTPS 协议能够对客户端和服务器之间的通信进行加密,保障通信的机密性和完整性。因此,在实践中需要使用 HTTPS 协议,避免数据在传输过程中被篡改。
- Token 时效性
Token 应该设置一定的时效性,避免在客户端崩溃等情况下 Token 被长时间滞留,增大攻击风险。一个较为合理的设置是设置 30 分钟的过期时间。
- Token 生成
Token 的生成应该使用符合安全标准的方法进行,例如 HMAC、JWT 等加密算法。
结语
本文介绍了 RESTful API 中常用的身份认证方式,以及身份认证的实践技巧。在应用中,开发者需要根据具体的业务和安全需求,选择合适的认证方式。同时,开发者需要加密存储和良好管理 Token,避免被黑客攻击。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cfedcfe46428fe9ec3ed4a