这段时间一直在基于 Tars 做开发。最近的文章也可能是针对 Tars 的一些学习笔记。前面咱们搭建了 Tars 基础框架,打开了 Tars web 管理界面进行服务的运维操做。不过读者确定很快就会发现:这好像不用登陆啊,那怎么保证只有有权限的用户才能更改服务呢?javascript
显然 Tars web 是支持用户鉴权的。官方文档在这里。本文记录一下个人用户体系对接实验中的一些笔记,便于其余 Tars 的用户参阅。(特别是像我这样对 Node.js 不熟悉的小白……)html
本系列文章:java
本文地址:http://www.javashuo.com/article/p-bhrptyll-u.htmlgit
若是要启用 Tars web 的用户功能,那么首先开发者须要设计一个本身的用户登陆服务。该服务是 http 服务,有独立的用户登陆、登出功能。Tars Web 自己实现了一个简单的用户功能,不过本文咱们从新设计一个。为便于说明,咱们假设这个 Tars web 和用户服务 web 环境以下:github
https://tars.amc.com
https://user.amc.com
从用户经过浏览器访问 Tars web 管理平台开始,若是启用了用户功能,那么基本流程以下:web
一言以蔽之:每当浏览器向 Tars web 发起一个请求时,Tars web 均向用户服务器发起请求,判断用户是否有权限;若是鉴权经过,则正常操做 Tars;若是没有,则重定向至用户登陆页面。json
用户体系配置在 TarsWeb/config/loginConfig.js 文件中,读者能够查询代码直接研究详细用法,我这边对接的是最基础的功能(其实也够用了),下面列出涉及到的相关配置值:segmentfault
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 白名单 };
有了这个配置以后,咱们从新说明一下前文的图片:浏览器
用户经过浏览器访问 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%3A%2F%2Ftars.amc.com%2F
浏览器经过重定向的 URL 访问用户服务,并进行登陆操做。用户服务应可以根据 Tars Web 带上的 redirect_url
参数,在用户登陆成功后,跳转到 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 值。其实这样的逻辑也够了。
本文给出了一个最简单的对接第三方用户体系的方法。其实笔者是想要对接微信网站登陆的,不过由于本身手头没有作网站备案而做罢。不过为企业网站部署的读者,也能够这么作,这样其实安全性更高,并且操做更方便。
本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。
原做者: amc,欢迎转载,但请注明出处。
发布日期:2019-4-7
原文连接:https://cloud.tencent.com/developer/article/1410611。