在现代 Web 应用程序中,API 已成为了交互和通信的基本构建块。因此,用户身份验证和授权是 API 设计中最重要的部分之一。在本文中,我们将探讨 RESTful API 中的身份认证和用户授权的概念和最佳实践。
身份认证和授权的区别
身份验证和授权是两个相关但不同的概念。身份验证是指确认用户的身份;而授权是指确认用户是否有权限执行某个操作。
例如,当用户登录应用程序时,应用程序会验证用户的凭据以确认用户的身份。之后,系统会使用身份认证信息中的数据作为输入来检查用户已授予的权限,以决定是否允许用户执行某些操作。
API 身份认证
RESTful API 中有多种身份验证机制可供选择,包括以下几个方面:
HTTP 基本身份认证
HTTP 基本身份认证可以确保只有授权用户才能访问受保护的资源。认证是通过将用户名和密码发送到服务端,然后服务器基于这些信息决定是否提供受保护的资源。HTTP 基本身份验证使用 Authorization
的 Header 字段。
以下是一个 HTTP 基本身份认证的示例:
GET /protected/resource HTTP/1.1 Host: example.com Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
在这个示例中,用 Base64 编码的值 YWxhZGRpbjpvcGVuc2VzYW1l
表示用户名和密码连接形成的字符串 “username:password”
.
Token 认证
Token 认证是一种使用 JSON Web Token(JWT)的备受推崇的方法。 在这种方法中,用户登录并接收到包含 JWT 的响应。之后,针对每次 API 请求,用户需在请求中包含此 JWT。API 会使用 JWT 检查身份并确定是否允许访问资源。
以下是一个 JWT 身份认证的示例:
const token = jwt.sign({userId: '123'}, 'SECRET_KEY', {expiresIn: '1h'}); // 下面是使用 token 访问受保护资源的 HTTP 请求 GET /protected/resource HTTP/1.1 Host: example.com Authorization: Bearer ${token}
其中,Token 的值为 Bearer ${token}
。这个 ${token}
就是每次在发送请求前需要生成的 JWT。
OAuth2
OAuth2 是另一种广泛使用的 API 身份验证协议,允许客户端代表用户访问服务。OAuth2 令牌允许客户端在没有用户凭据的情况下访问 API,但请求仍然需要进行身份验证。
以下是一个 OAuth2 的示例:
-- -------------------- ---- ------- ----- ------------ - --- ------- ------------ ---------------- ------------------------------------- -- ----- ----------- - ------------------------------ ------ - ------------------------------------------------- -------------------------------------------------- - --- -- ------------- -------------- ---- -- ---- ---- -- ----- --- ----- -------- ---- -- --------------------------- ----- ------ -- - -- ------ - ----------------------------------- ----- ----------- - ------------------- -- ---- --- --- -------------------------- - -------- - -------------- ------- ---------------- -- --- - ---
API 用户授权
当 API 确认用户的身份后,就需要对请求进行授权。授权是决定用户有权限访问受保护资源的过程。
基于角色的访问控制 (RBAC)
基于角色访问控制 (RBAC) 是一种广泛使用的用户授权技术。在 RBAC 中,用户会被分配一种或多种角色,而角色通常与访问资源相关联。在发出 API 请求时,用户需要提供其身份验证令牌,并在其中包含角色信息。API 或应用程序根据用户的角色决定是否允许用户访问请求资源。
以下是一个 RBAC 的示例:
-- -------------------- ---- ------- ----- ------------------- - ----- -------- ----------- -- - ----- ---- - ----- --------------------------------- ----- ----- - ---------- -- --- -- ----------------- -- ----------------------------------------- -- ---------------------------------- - ------ ----- - -- ---------------- -- ------------------------------- -- ------------------------------- - ------ ----- - -- ---------- ----- ------ ------ - -- ----------- --- --- ----------------------------- ----- ----- ---- -- - ----- ------ - ----------- --- - -- ------ --------------------------- ----------------------- - -- ------- - ---- - -- -- --------------- ------------------------- -- --- ---- ---------- -- ------ ---- ------------ - - ----- ------- - -- -- --- -------- ------ ----- ------------------------------------ - -- -- ---------- --- --- ------------------------- ----- ----- ---- -- - ----- ------ - ----------- --- - -- ------ --------------------------- ------------------- - -- ------- - ---- - -- -- --- ------------ ------------------------- -- --- ---- ---------- -- ------ ---- ------------ - - ----- ------- - -- -- --- -------- ------ ----- ------------------------------------ - --
结论
在设计 RESTful API 时,身份认证和用户授权是非常关键的部分。使用最佳实践和标准身份验证和授权协议,可以确保 API 安全并仅由授权且经过身份验证的用户访问。使用 RBAC 等授权技术,可以确保仅向拥有访问受保护资源的权限的用户提供访问权限。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67502710fbd23cf89073d3ea