這段時間一直在基於 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。