npm 包 oauth2orize-device-code 使用教程

阅读时长 10 分钟读完

前言

OAuth 2.0 是用于 API 访问授权的行业标准协议。 OAuth 2.0 授权过程中,用户需要使用授权服务器颁发的令牌来访问受保护的资源。然而,在设备上进行认证流程时存在问题,尤其对于小屏幕设备(如智能手表、车载信息娱乐系统等等)来说。为解决这个问题,OAuth 2.0 设备授权规范(Device Authorization Grant)出现了。在这个规范下,设备通过授权服务器颁发一个设备验证码,用户通过该验证码进行身份验证,再来获取授权。

oauth2orize-device-code 是一款 Node.js 的库,支持设备授权规范。它提供了多种传输层、存储层的验证策略,并且实现了 OAuth 2.0 设备授权规范,方便使用者进行快捷地部署。

安装

使用 npm 进行安装:

使用

设备端使用

在设备端中,第一步是向授权服务器询问认证信息。设备通过 HTTP GET 请求向授权服务器请求码认证和客户端的 ID。

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

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

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

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

设备收到响应后,展示 verification_uri、user_code 和 expires_in 信息,提示用户进行授权。用户将 user_code 输入到 verification_uri 指定的网址中。该网址通常是授权服务器上的一个页面,在页面上用户会被提示输入其凭证。

如果设备发现验证码已失效,则应重新发起码请求。间隔时间是由服务器响应的 interval 字段决定的。

设备持续轮询访问 access_token 接口:

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

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

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

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

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

注: 上例中,为了方便理解,我们每 5 秒进行一次轮询,但实际应用中,轮询策略应该根据服务器给出的 interval 参数调节。

Node.js 服务端使用

oauth2orize-device-code 设计上,低耦合、高扩展。我们需要实现 validateDeviceCode 和 saveToken 两个函数,授权服务器的实现从而被完成。

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

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

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

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

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

在上述代码中,在定义 validateDeviceCode 函数时,我们需要实现存储介质对 deviceId, userCode 的验证,并根据验证结果返回 clientId, userId;而 saveToken 函数中我们需要实现存储介质对 access_token 的存储。

oauth2orize-device-code 实现了 OAuth2 设备授权规范的细节,避免了开发者重新实现一个 OAuth 2.0 设备授权服务实现的复杂过程。

示例代码

更多用例参考 GitHub

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

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

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

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

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

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

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

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

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

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

这个示例代码我们实现了授权服务器的一个很简单的存储介质。授权请求携带的 deviceId 和 userCode,以及最终生成的 access_token,都是硬编码实现的。实际使用中,你需要自己封装各种介质的数据库层服务,以便集成该组件。

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

纠错
反馈