前言
OAuth 2.0 是用于 API 访问授权的行业标准协议。 OAuth 2.0 授权过程中,用户需要使用授权服务器颁发的令牌来访问受保护的资源。然而,在设备上进行认证流程时存在问题,尤其对于小屏幕设备(如智能手表、车载信息娱乐系统等等)来说。为解决这个问题,OAuth 2.0 设备授权规范(Device Authorization Grant)出现了。在这个规范下,设备通过授权服务器颁发一个设备验证码,用户通过该验证码进行身份验证,再来获取授权。
oauth2orize-device-code 是一款 Node.js 的库,支持设备授权规范。它提供了多种传输层、存储层的验证策略,并且实现了 OAuth 2.0 设备授权规范,方便使用者进行快捷地部署。
安装
使用 npm 进行安装:
npm install --save oauth2orize-device-code
使用
设备端使用
在设备端中,第一步是向授权服务器询问认证信息。设备通过 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