简介
在现代 web 应用中,我们通常需要实现用户身份验证和会话管理等功能。为了避免重复造轮子,我们可以使用第三方的身份认证包来加速开发。npm 包 anywhere-auth
是一个轻量级的身份认证包,能够帮助我们快速搭建身份认证和会话管理的框架。本文将介绍如何使用该包进行开发。
安装
使用以下命令安装 anywhere-auth
:
npm install anywhere-auth
初始化
在项目中引入 anywhere-auth
:
const AnywhereAuth = require('anywhere-auth');
然后初始化 AnywhereAuth
对象并传入一个配置项:
const anywhereAuth = new AnywhereAuth({ secret: 'your-secret-string' });
配置项包括:
secret
:用于加密和解密用户会话的密钥;cookie
:cookie 相关配置,包括name
(cookie 名字,默认为auth
)、maxAge
(cookie 最大有效期,默认为 7 天)、httpOnly
(是否只能通过 HTTP 访问,默认为 true)等等;session
:session 相关配置,包括store
(session 存储方式,默认为一个简单的内存存储器)、maxAge
(session 最大有效期,默认为 1 小时)等等;jwt
:jwt 相关配置,包括algorithm
(jwt 的签名算法,默认为 HS256)、expiresIn
(jwt 的有效期,默认为 1 小时)等等。
设计用户模型
anywhere-auth
不负责用户管理,需要我们自己设计用户模型并实现相应的方法。例如,我们可以设计一个用户模型如下:
{ username: String, password: String, roles: Array // 用户角色,例如 ['admin', 'editor'] }
然后,我们需要实现以下方法:
getUserByName(username: string) -> {username: string, password: string, roles: array}
:根据用户名获取用户;comparePassword(password: string, hash: string) -> boolean
:用于比较密码和密码哈希值是否一致。
例如,我们可以使用 MongoDB 存储用户数据,并实现以上两个方法:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ------ - ------------------ ----- ---------- - --- ----------------- --------- ------- --------- ------- ------ -------- --- -------------------------------- - ----- ------------------ - ------ -------------- -------- --- -- ---------------------------------- - ----- ------------------ ----- - ------ ------------------------ ------ -- ---------------------- ----- ---------- - -- -------------- -- ---------------------------- - ----- ---- - ----- -------------------------- ---- ------------- - ----- - --- ----- ---- - ---------------------- ------------
实现身份认证路由
为了实现身份认证和会话管理,我们需要独立于应用的一些路由,例如登录、注册、注销等。在这些路由中,我们使用 anywhere-auth
提供的方法来完成相应的功能。
注册
首先,我们需要实现用户注册的路由。当用户注册成功后,我们需要为其建立一个会话并返回一个 token。
-- -------------------- ---- ------- ------------------------- ----- ----- ---- -- - ----- - --------- -------- - - --------- ----- ---- - ----- ------------- --------- --------- ------ -------- --- ----- ----- - ----- ---------------------------------------- ------------------ ------ - --------- ---- --- ---------- -------- ---- --- ---
在 anywhereAuth.createToken()
方法中,默认会将用户角色存放在 jwt payload 中,以便后续对用户角色进行鉴权。
登录
在用户登录成功后,我们需要为其建立一个会话并返回一个 token。
-- -------------------- ---- ------- ---------------------- ----- ----- ---- -- - ----- - --------- -------- - - --------- ----- ---- - ----- ----------------------------- -- ------- - ---------------------- -------- ----------- --- ------- - ----- ----- - ----- ------------------------------ --------------- -- -------- - ---------------------- -------- ----------- --- ------- - ----- ----- - ----- ---------------------------------------- ------------------ ------ - --------- ---- --- ---------- -------- ---- --- ---
注销
注销会话时,我们只需要删除客户端上的 token 即可。
app.post('/api/logout', (req, res) => { res.cookie('auth', '', { maxAge: 0 }); res.json({ success: true }); });
鉴权
在某些受保护的路由上,我们需要对用户进行鉴权。例如,管理员才能访问的路由:
app.get('/api/users', anywhereAuth.checkRole(['admin']), async (req, res) => { const users = await User.find(); res.json(users); });
anywhereAuth.checkRole()
方法的作用是验证用户是否拥有某个角色。如果用户不存在或者角色不匹配,该方法会返回 401
,否则可以通过该方法进行身份认证和授权。
示例代码
完整的示例代码可以参考以下 Github 仓库:https://github.com/anywhere-consortium/anywhere-auth-demo。
总结
anywhere-auth
是一个轻量级的身份认证包,可以帮助我们快速搭建身份认证和会话管理的框架。在使用该包时,我们需要自行设计用户模型并实现相应的方法。同时,在实现路由时,我们也需要加入相应的鉴权逻辑,以确保应用的安全性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005671281e8991b448e35ec