如何使用 OAuth 2.0 保护 RESTful API

阅读时长 12 分钟读完

随着 Web 2.0 时代的到来,RESTful APIs 变得越来越普及。在开发现代 Web 应用程序时,将 RESTful 端点作为分布式系统的核心不是罕见的事情。RESTful APIs 让应用程序可以无缝地与其他应用程序共享数据,并提供了一种轻量级的方法来访问应用程序的后端服务。但是,随着 RESTful APIs 的增长,安全问题也开始浮出水面。因此,保护 RESTful APIs 已经成为开发人员及企业的一个重要问题。

在本文中,我们将讨论如何使用 OAuth 2.0 来保护 RESTful APIs。OAuth 2.0 是一项为分布式系统设计的开放标准,可以在不直接暴露用户凭据的情况下,授权第三方应用程序访问受保护的资源。尽管 OAuth 2.0 的实现可以复杂,但是它能够提供卓越的安全级别,而且各大厂商越来越支持 OAuth 2.0,这也使得它成为保护 RESTful APIs 的最佳解决方案之一。

OAuth 2.0 系统架构

OAuth 2.0 最重要的概念是授权服务器、资源服务器和客户端。授权服务器和资源服务器可以合并为同一个物理实例,但是它们在 OAuth 2.0 协议中是不同的实体。

授权服务器是负责验证用户身份并授权给第三方应用程序访问受保护资源的服务器。通常情况下,它们应该是独立的服务器,以便于必要时可以垂直扩展。授权服务器通常会提供一些授权协议,例如授权码授权流、隐式授权流和客户端凭据授权流。

资源服务器是实际存在的资源,例如图像、文件和文档等。资源服务器从授权服务器接收令牌,以验证确实具有访问资源的权限。资源服务器可以是与授权服务器完全分离的单独服务器,也可以与授权服务器合并为单个实例。

客户端是使用 OAuth 2.0 来访问受保护资源的第三方应用程序。每个客户端都有一个客户端 ID 和一个客户端密码(可选)。在 OAuth 2.0 协议中,客户端必须先通过授权服务器才能获得访问令牌。

下面是一个 OAuth 2.0 协议示意图,演示了三个实体之间的关系。

OAuth 2.0 授权流程

OAuth 2.0 协议涉及多种授权流程,仅仅在特定应用场景下适用。 以下是 OAuth 2.0 最常用的授权流之一 - “授权码授权流”:

  1. 客户端请求授权码。客户端将用户重定向到授权服务器,用户需要输入密码以授权应用程序执行某些操作。
  1. 用户授权客户端。授权服务器询问用户是否允许客户端执行需要使用其资源的操作。如果是,则授权服务器将重定向用户到客户端指定的 redirect_uri。

  2. 客户端通过授权码获取访问令牌。客户端通过发送带有授权码的 POST 请求,向授权服务器请求访问令牌。

  1. 授权服务器响应访问令牌。如果授权服务器接受了客户端发出的请求,则它将响应以 JSON 格式返回访问令牌,并将其保存在客户端缓存中,请注意访问令牌的期限和刷新令牌的机制。
-- -------------------- ---- -------
-------- --- -- 
------------- ------------------------------ 
-------------- -------- 
------- --------

- 
 ---------------------------------------- 
 ---------------------- 
 ------------------ 
 ----------------------------------------- 
 ----------------------------------- 
-
  1. 客户端使用访问令牌访问资源。在使用访问令牌访问资源时,客户端通过将其自身的 OAuth 2.0 令牌和访问令牌传递给资源服务器来证明其身份和授权凭据。

示例代码

以下是一个基于 Node.js 的示例应用程序,演示了如何使用 Passport 和 OAuth2orize 库来实现授权服务器和客户端。

授权服务器

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

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

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

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

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

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

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

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

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

客户端

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

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

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

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

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

结论

保护 RESTful APIs 是开发现代 Web 应用程序不可或缺的一步。OAuth 2.0 是许多企业和开发人员选择的一种方法,因为它为分布式系统设计,可以为其提供非常高的安全级别,并且能够很好地与各种应用程序和 API 集成。在选择使用 OAuth 2.0 之前,开发人员需要仔细研究 OAuth 2.0 的工作原理,以确保其正确实施。通过正确使用 OAuth 2.0,可以帮助你的应用程序在安全性、可靠性和用户体验方面达到新的高度。

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

纠错
反馈