在认证授权过程中,OAuth2 是一个非常流行的授权协议。OAuth2 通常会要求资源拥有者进行授权,由该资源的客户端和服务器进行交流,获得授权 Token 后才可以访问相关的资源。oauth2orize-password-realm 是一个针对 Node.js 的可以使用密码和领域识别用户客户端的实现。本文将详细介绍 npm 包 oauth2orize-password-realm 的使用方法。
教程目录
- 安装
- 如何使用
- 客户端身份验证
- Oracle 密码加密解密
- 示例代码
- 结论
安装
在安装之前需要确保已经安装了 Node.js 和 npm。可以通过以下命令安装:
$ npm install oauth2orize-password-realm
安装成功后,便可以使用 require
引入了。
如何使用
oauth2orize-password-realm 的使用与其他 oauth2orize 是类似的。如下是其中一些最重要的模块:
const oauth2orize = require('oauth2orize'); const login = require('connect-ensure-login'); const { PasswordGrantToken } = require('oauth2orize-password-realm');
需要自己创建相应的 OAuth 2.0 server
,passport.js
,clientSerializer
和 userSerializer
。
-- -------------------- ---- ------- ----- ------------ - --------------------------- ----- ------------- - --- --------------------------- --------- --------- ------ -------- -- ------ -------------- --------- --------- ------ ----- -- ----- ----- --- -- ----- ------ ---------- -- ------- ------ ---------- ------- ------------------------------ ------------- -------- - -- ---- -- --------- ------ ---------- ------- ------ ---------- ------ --- --- --- ------------------------------------------ ------------------------------------------------
这里实例化 PasswordGrantToken,传入了一个回调函数,该回调函数在客户端请求创建 tokens 时调用。
对于调用 authorize 端点的客户端应用程序,以下授权代码应该被包含在其中:
-- -------------------- ---- ------- --------------------------- ----------------------- ----------------------------------- ------------ ----- - ------------------------- -------- ----- ------- - -- ----- - ------ ---------- - -- --------- - ------ ---------- ------- - ------ ---------- ------- ------------ --------------- --- --- ------------- ----- -------------------- - -------------- ------------------------- ----- --------- ------- ----------------- --- -- -----------------------
路由需要限制范围,以下是一个示例:
router.post('/oauth/token', passport.authenticate(['clientPassword', 'clientBasic'], { session: false }), server.token(), server.errorHandler());
客户端身份验证
客户端身份验证是资源拥有者授权过程的必须过程。与其他 oauth2orize 一样,oauth2orize-password-realm 支持 clientCredentials
身份验证和 basicAuth
身份验证。
clientCredentials
身份验证可以通过以下代码在客户端请求 tokens
端点时实现。
passport.use('clientPassword', new BasicStrategy(function(clientID, clientSecret, done) { Client.findOne({ clientID: clientID }, function (err, client) { if (err) { return done(err); } if (!client) { return done(null, false); } if (client.clientSecret !== clientSecret) { return done(null, false); } return done(null, client); }); }));
basicAuth
身份验证可以通过以下代码在客户端请求 tokens
端点时实现。
passport.use('clientBasic', new ClientPasswordStrategy(function(clientID, clientSecret, done) { Client.findOne({ clientID: clientID }, function (err, client) { if (err) { return done(err); } if (!client) { return done(null, false); } if (client.clientSecret !== clientSecret) { return done(null, false); } return done(null, client); }); }));
Oracle 密码加密解密
oauth2orize-password-realm 还提供了加密解密方法,内置了 Oracle 加密算法。算法的加密解密方法如下。
const { OracleEncryption } = require('oauth2orize-password-realm'); let oracleEncryption = new OracleEncryption({ encryptionKey: Buffer.from("6D65737361676503", "hex"), }); const encryptedPassword = oracleEncryption.encrypt(password); const decryptedPassword = oracleEncryption.decrypt(encryptedPassword);
OracleEncryption
构造函数可以传输一个选项对象,它支持下面几个属性:
- encryptionKey: encryption key 对象,长度必须是 24 位,可以用
hex
,base64
和binary
方式传输协议。 - entityMapping: 特殊格式映射。本地解码适用于多个客户端的组合身份验证。
- cipherAlgorithm: 加密算法。默认使用 EDE3
示例代码
以下是 oauth2orize-password-realm 的示例代码。
-- -------------------- ---- ------- ----- ----------- - ----------------------- ----- ----- - -------------------------------- ----- - ------------------ - - -------------------------------------- -- ------- ------------------------------ --- -------------------------------- ------------- ----- - ---------------- --------- -------- -- -------- ----- ------- - -- ----- - ------ ---------- - -- --------- - ------ ---------- ------- - -- -------------------- --- ------------- - ------ ---------- ------- - ------ ---------- -------- --- ---- -- ------ ---- ----- - ---------------- - - -------------------------------------- ----- ---------------- - --- ------------------ -------------- ------------------------------- ------- --- ----- ----------------- - ------------------------------------- ---------------------- ----------- ----------------------------------- ----- ----------------- - -------------------------------------------- ---------------------- ----------- ------------------- -- ---- -- ----- ---- - ------------------ -- ------ -- ----- ------ - -------------------- -- ----- --- ------ ----- ------ - --------------------------- ----- ------------- - --- --------------------------- --------- --------- ------ -------- -------------- --------- --------- ------ ----- -- ----- ----- --- -- ----- ------ ---------- -- ------- ------ ---------- ------- ------------------------------ ------------- -------- - -- ---- -- --------- ------ ---------- ------- ------ ---------- ------ --- --- --- ------------------------------------ ------------------------------------------ -- ------- --- ------- - - - --------- --------- ------------- --------- ------------ -------------------------------------- ------- ------------- -------- -------- ------ ---------- -- -- -- ----- ------------------------ -- - --- --------- - --- --------------- ----------------- --- -- ---- ----------------------------- ----- -- - ---------- --------- --- ----------------------------- ----- -- - ----------------- ----- ----- -- - --------- ------ --- --- -- ---- ------------------------------- ------------------------------- - -------- ----- --- ----- ---- -- - ---------- -------- -------- -- --- ---------- ---- ---------------------- --- - -- -- ------ ----------------- ----- ---- -- - -------------------- --- -- ------ ------------------ ------------------------------ - ---------------- -------- --- ----- ---- -- - ------------------ - -- -- ------ --------------------------- ----------------------- ----------------------------------- ------------ ----- - ---------------- --------- -------- -- -------- ----- ------- - -- ----- - ------ ---------- - -- --------- - ------ ---------- ------- - -- ------------------- --- ------------ - ------ ---------- ------- - ------ ---------- ------- ------------------- --------------- --- --- ------------- ----- -------------------- - -------------- ------------------------- ----- --------- ------- ----------------- --- --- -- ------ ------------------------------------- ----------------------- ------------------- -- -- ----- -- ------------------------ ---------------------------------------- --------------- - -------- ----- --- --------------- ----------------------- -------------- - ----
结论
oauth2orize-password-realm 提供了一个通过密码和领域识别用户客户端的解决方法。在使用时需要结合 oauth2orize 和 passport.js,本文提出了一个较为完整的实现方案。此外,它也提供了 Oracle 加密算法的实现,这是一个强加密算法,可以有效地保护登录用户密码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60066f983d1de16d83a66dbd