背景
这段时间一直在基于 Tars 作开发. 最近的文章也多是针对 Tars 的一些学习笔记. 前面我们搭建了 Tars 基础框架, 打开了 Tars web 管理界面进行服务的运维操作. 不过读者肯定很快就会发现: 这好像不用登录啊, 那怎么保证只有有权限的用户才能更改服务呢?
显然 Tars Web 是支持用户鉴权的. 官方文档在这里. 本文记录一下我的用户体系对接实验中的一些笔记, 便于其他 Tars 的用户参阅.(特别是像我这样对 Node.JS 不熟悉的小白......)
Tars 用户鉴权流程
准备
如果要启用 Tars Web 的用户功能, 那么首先开发者需要设计一个自己的用户登录服务. 该服务是 http 服务, 有独立的用户登录, 登出功能. Tars Web 本身实现了一个简单的用户功能, 不过本文我们重新设计一个. 为便于说明, 我们假设这个 Tars Web 和用户服务 Web 环境如下:
- Tars Web URL:
- https://tars.amc.com
用户 Web URL:
https://user.amc.com
基本流程
从用户通过浏览器访问 Tars Web 管理平台开始, 如果启用了用户功能, 那么基本流程如下:
一言以蔽之: 每当浏览器向 Tars Web 发起一个请求时, Tars Web 均向用户服务器发起请求, 判断用户是否有权限; 如果鉴权通过, 则正常操作 Tars; 如果没有, 则重定向至用户登录页面.
Tars Web 端配置
用户体系配置在 TarsWeb/config/loginConfig.JS 文件中, 读者可以查询代码直接研究详细用法, 我这边对接的是最基础的功能 (其实也够用了), 下面列出涉及到的相关配置值:
- module.exports = {
- enableLogin: true, // 启用登录验证
- loginUrl: 'https://user.amc.com/login.html', // 当鉴权失败时, 重定向的 URL
- redirectUrlParamName: 'redirect_url', // 上述重定向时, 在 URL 中带 Tars 原 URL 的参数名. 后文说明
- uidCookieName: 'uid', // 用户服务在 cookies 里用于保存用户名的 cookie 名
- ticketCookieName: 'ticket', // 用户服务在 cookies 里用于保存票据的 cookie 名
- cookieDomain: 'amc.com', // 用户服务的 cookies 所属的域, 注意需让 Tars Web 能够访问到
- validate: "https://auth.amc.com/cgi-bin/validate", // Tars Web 向用户服务判断是否有去用户权限时使用的请求
- validateUidParamName: 'uid', // 请求 validate 时, POST body 中存放用户名的参数名
- validateTicketParamName: 'ticket', // 请求 validate 时, POST body 中存放票据的参数名
- validateMatch: [ // validate 返回 JSON 响应时, Tars Web 如何判断结果
- ['code', 0], // 这样表示判断条件为 resp.code == 0
- ['data.result', true] // 表示判断条件为 resp.data.result == true
- ], // 多个条件为 AND 的关系, 需要全部条件均通过才认为鉴权通过
- ignore: ['/static'], // 表示不需要登录校验的路径, 如果每个请求都向用户鉴权一下, 还是很浪费的
- ignoreIps: [], // 访问 IP 白名单
- };
有了这个配置之后, 我们重新说明一下前文的图片:
无票据或票据失效情况下访问 Tars Web
用户通过浏览器访问 https://tars.amc.com, 此时 Tars Web 根据配置里说明的, 从 cookie 中, 取出 uid 和 ticket 参数值, 然后以以下 JSON 格式, 向 https://user.amc.com/cgi-bin/validate 发出请求:
- {
- "uid": "xxxxx", // 如果 cookie 不存在, 这里的值会是 "undefined"
- "ticket": "xxxxx", // 如果 cookie 不存在, 这里的值会是 "undefined"
- }
user.amc.com 返回失败的时候, 只要不返回 validateMatch 中指定的条件就行了.
此时 TarsWeb 会直接返回 http 状态码 307, 重定向 URL :
https://user.amc.com/login.html?redirect_url=https://tars.amc.com/
通过登录服务登录
浏览器通过重定向的 URL 访问用户服务, 并进行登录操作. 用户服务应能够根据 Tars Web 带上的 redirect_url 参数, 在用户登录成功后, 跳转到 Tars Web 上.
票据有效时访问 Tars Web
用户登录成功后, 重定向到 Tars Web 或用户在票据有效期内访问 Tars Web 时, Tars 依然会按照配置, 请求 https://user.amc.com/cgi-bin/validate 以判断票据. 此时按照配置, 用户服务应该返回包含以下信息:
- {
- "code": 0,
- "data": {
- "result": true
- }
- }
这样, Tars Web 根据配置, 就能认为票据是有效的, 因而继续后续的 Tars 操作.
用户登出
登录成功后, 用户可以看到在 Tars Web 界面的右上角出现了自己的 uid 名. 用户名的下拉菜单只有一个选项, 就是注销操作. 在没有配置 logoutUrl 的情况下, Tars Web 实现退出登录的逻辑就是简单地删掉配置中提及的 uid 和 ticket cookies 值. 其实这样的逻辑也够了.
右上角. PNG
结语
本文给出了一个最简单的对接第三方用户体系的方法. 其实笔者是想要对接微信网站登录的, 不过因为自己手头没有做网站备案而作罢. 不过为企业网站部署的读者, 也可以这么做, 这样其实安全性更高, 而且操作更方便.
本文章采用 知识共享署名 - 非商业性使用 - 相同方式共享 4.0 国际许可协议 https://creativecommons.org/licenses/by-nc-sa/4.0/ 进行许可.
来源: https://www.qcloud.com/developer/article/1410611