RESTful API 中常见的认证和授权方式

阅读时长 11 分钟读完

在当前互联网应用架构中,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 代码:

-- -------------------- ---- -------
----- ------- - -------------------
----- --- - ------------------------
----- --- - ----------
----- ---- - -----

------------------------ -- --- ------- ----------------
---------------------------- --------- ---- ---- -- --- ------- ---------------------------------

----- ----- - -
  -
    --- --
    ----- ----- -----
    ------ -----------------------
    --------- --------
  -
--

-------- ------------------ ------ -------- -- -
  ----- ---- - --------------- -- ---------- --- ----- -- ------------- --- ----------
  -- ------ -
    ------ -
      --- --------
      ----- ----------
      ------ ----------
    --
  - ---- -
    ------ -----
  -
-

-------- ------------------------- -
  ------ -------------- ----------
-

-------- ------------------------ -
  --- -
    ------ ----------------- ----------
  - ----- --- -
    ------ -----
  -
-

-------- -------------------- ---- ----- -
  ----- ---------- - --------------------------
  -- ------------ -
    ----- ----- - ------------------ ------
    ----- ---- - -------------------------
    -- ------ -
      -------- - -----
      -------
    - ---- -
      -------------------------------------
    -
  - ---- -
    -------------------------------------
  -
-

---------------------- ----- ---- -- -
  ----- - ------ -------- - - ---------
  ----- ---- - ------------------ ------ -------- ---
  -- ------ -
    ----- ----- - --------------------------
    ---------- ----- ---
  - ---- -
    -------------------------------------
  -
---

--------------------- ---------------- ----- ---- -- -
  ----------------
---

---------------- -- -- -
  ------------------- --------- -- ---- ----------
---
展开代码

在这个示例中,我们首先实现了 generateAccessTokenverifyAccessToken,用于生成和校验 Token。然后,我们在 /api/token 接口中校验用户名和密码,并在校验成功后生成 Token。客户端使用此 Token 访问 /api/users 接口时,我们使用 bearerTokenAuth 中间件进行校验。

OAuth 2.0 授权

OAuth 2.0 是一种广泛应用于 Web 服务的开放标准。与其他独立的认证和授权方案不同,OAuth 2.0 是一个授权框架,它允许第三方应用通过代表用户而访问受保护的资源。OAuth 2.0 授权包括以下步骤:

  1. 用户向第三方应用提供凭据
  2. 应用使用这些凭据申请访问令牌并进行身份验证
  3. 应用使用访问令牌访问用户的受保护资源

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,用于申请访问令牌。身份验证成功后,我们会得到一个包含 accessTokenrefreshTokenprofile 的对象,我们可以使用这些信息进行后续操作,比如在 /api/users 上校验用户。

结语

在这篇文章中,我们介绍了常见的 RESTful API 认证和授权方式,它们分别是基本认证,Bearer Token 认证和 OAuth 2.0 授权。在使用它们时,我们需要权衡它们的优缺点和适用场景,从而选择合适的方式来保证 API 的安全性。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67bf2f1f0c976d473a3a7e02

纠错
反馈

纠错反馈