在当前互联网应用架构中,RESTful API 已经成为了一个普遍的概念。而在使用 RESTful API 的过程中,我们难免需要对 API 进行认证和授权。在这篇文章中,我们将会详细介绍 RESTful API 中常见的认证和授权方式,以及它们的优缺点和适用场景。
基本认证
基本认证是一种常见的 RESTful API 认证方式,它需要客户端将用户名和密码编码后添加到 HTTP 请求头中,相应的请求头的格式如下:
Authorization: Basic [base64 encoded username:password]
其中,[base64 encoded username:password]
表示用户名和密码被编码后的值,客户端需要在此处使用 Base64 进行编码。服务器收到请求后,会使用用户名和密码进行校验,如果通过校验,则允许客户端访问相应资源。
基本认证的优点在于它非常简单,容易实现。然而,它的缺点也非常明显,即它不够安全。这是因为基本认证使用明文传输,可能被黑客截取并窃取密码。除此之外,基本认证也无法应对 XSS 和 CSRF 等攻击。
以下是 Node.js 中基本认证的示例代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ----- ---- - ----- ------------------------ -- --- ------- ---------------- ---------------------------- --------- ---- ---- -- --- ------- --------------------------------- ----- ----- - - - --- -- ----- ----- ----- ------ ----------------------- --------- -------- - -- -------- ------------------ ------ -------- -- - ----- ---- - --------------- -- ---------- --- ----- -- ------------- --- ---------- -- ------ - ------ - --- -------- ----- ---------- ------ ---------- -- - ---- - ------ ----- - - -------- -------------- ---- ----- - ----- ---------- - -------------------------- -- ------------ - ----- ---- - ------------------------------ ------ -------------------------------- ----- ----- - -------- ----- -------- - -------- ----- ---- - ------------------ ------ -------- --- -- ------ - -------- - ----- ------- - ---- - ------------------------------------- - - ---- - ------------------------------------- - - --------------------- ---------- ----- ---- -- - ---------------- --- ---------------- -- -- - ------------------- --------- -- ---- ---------- ---展开代码
这是一个使用基本认证的简单示例,我们在 HTTP 请求头中添加了 Authorization: Basic [base64 encoded email:password]
,然后在服务器端进行了校验。如果校验通过,则允许客户端访问 /api/users
接口。
Bearer Token 认证
Bearer Token 认证是另一种常见的 RESTful API 认证方式,它需要客户端将获得的 Token 添加到 HTTP 请求头中,请求头的格式如下:
Authorization: Bearer [access_token]
Bearer Token 认证在安全性方面优于基本认证。比如,服务器可以将 Token 进行加密,并设定 Token 的失效时间。另外,由于 Token 是在客户端和服务器之间传输的,它可以被加密和签名,从而防止黑客截取和窃取。
我们在使用 Bearer Token 认证时,需要先实现 Token 的生成和校验,然后在服务器端进行判断。万幸的是,几乎所有的现代编程语言中都有第三方库可以方便地实现这些功能。
以下是利用 JWT(JSON Web Token)实现 Bearer Token 认证的 Node.js 代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ------------------------ ----- --- - ---------- ----- ---- - ----- ------------------------ -- --- ------- ---------------- ---------------------------- --------- ---- ---- -- --- ------- --------------------------------- ----- ----- - - - --- -- ----- ----- ----- ------ ----------------------- --------- -------- - -- -------- ------------------ ------ -------- -- - ----- ---- - --------------- -- ---------- --- ----- -- ------------- --- ---------- -- ------ - ------ - --- -------- ----- ---------- ------ ---------- -- - ---- - ------ ----- - - -------- ------------------------- - ------ -------------- ---------- - -------- ------------------------ - --- - ------ ----------------- ---------- - ----- --- - ------ ----- - - -------- -------------------- ---- ----- - ----- ---------- - -------------------------- -- ------------ - ----- ----- - ------------------ ------ ----- ---- - ------------------------- -- ------ - -------- - ----- ------- - ---- - ------------------------------------- - - ---- - ------------------------------------- - - ---------------------- ----- ---- -- - ----- - ------ -------- - - --------- ----- ---- - ------------------ ------ -------- --- -- ------ - ----- ----- - -------------------------- ---------- ----- --- - ---- - ------------------------------------- - --- --------------------- ---------------- ----- ---- -- - ---------------- --- ---------------- -- -- - ------------------- --------- -- ---- ---------- ---展开代码
在这个示例中,我们首先实现了 generateAccessToken
和 verifyAccessToken
,用于生成和校验 Token。然后,我们在 /api/token
接口中校验用户名和密码,并在校验成功后生成 Token。客户端使用此 Token 访问 /api/users
接口时,我们使用 bearerTokenAuth
中间件进行校验。
OAuth 2.0 授权
OAuth 2.0 是一种广泛应用于 Web 服务的开放标准。与其他独立的认证和授权方案不同,OAuth 2.0 是一个授权框架,它允许第三方应用通过代表用户而访问受保护的资源。OAuth 2.0 授权包括以下步骤:
- 用户向第三方应用提供凭据
- 应用使用这些凭据申请访问令牌并进行身份验证
- 应用使用访问令牌访问用户的受保护资源
OAuth 2.0 最常用于访问第三方 API,比如 Facebook,GitHub,Google 等。
以下是利用 Passport.js 实现 OAuth 2.0 授权的 Node.js 示例代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- -------- - -------------------- ----- -------------- - -------------------------------------------- ----- --- - ---------- ----- ---- - ----- ---------------- ---------------- --------- ----------------- ------------- --------------------- ------------ ----------------------- -- ------------- ------------- -------- ----- -- - -- --------------- ---------- --------- ---- ----------------------------- ----- -- - ---------- ------ --- ------------------------------- ----- -- - ---------- ------ --- ------------------------ -- --- ------- ---------------- ---------------------------- --------- ---- ---- -- --- ------- --------------------------------- ------------------------------- ---------------------------- ----------------------- ------------------------------- - ------ ----------- ---- -------------------------------- ------------------------------- - ---------------- -------- --- ----- ---- -- - ------------------ --- --------------------- ----- ---- -- - -- ----------------------- - ------------------- - ---- - ------------------------------------- - --- ---------------- -- -- - ------------------- --------- -- ---- ---------- ---展开代码
在这个示例中,我们使用了 Passport.js 中的 passport-google-oauth20
Strategy,它是 OAuth 2.0 的一个实现,并提供了 Google 的身份验证和授权机制。在 /auth/google
路径上,我们使用 passport.authenticate
中间件进行身份验证,并指定了 scope
,用于申请访问令牌。身份验证成功后,我们会得到一个包含 accessToken
,refreshToken
和 profile
的对象,我们可以使用这些信息进行后续操作,比如在 /api/users
上校验用户。
结语
在这篇文章中,我们介绍了常见的 RESTful API 认证和授权方式,它们分别是基本认证,Bearer Token 认证和 OAuth 2.0 授权。在使用它们时,我们需要权衡它们的优缺点和适用场景,从而选择合适的方式来保证 API 的安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bf2f1f0c976d473a3a7e02