JustAuth 故事會:群主,你的代碼出 BUG 了!
JustAuth 用戶故事:群主,你的代碼出 BUG 了!
以下內(nèi)容改編整理自 JustAuth 社區(qū)群(QQ 群,230017570),為保護隱私,已經(jīng)隱去相關關鍵信息,文章部分內(nèi)容為潤色后的。
場景
小帥哥 在使用 JustAuth 時遇到了一些問題,通過在JustAuth 社區(qū)群(QQ 群)中提問的形式尋找解決方案。期間分別由小A、小B等群友參與解答,最后在群主大帥哥的細致解答下,成功解決了小帥哥的所有疑問,并獲得小帥哥的全方位好評!
問題一
小帥哥:群主大帥哥,我用 Gitee 測試時,遇到了一個 BUG,瀏覽器提示我“存在錯誤,請求范圍無效、未知或格式不正確”,這是因為什么?是你寫出 BUG 了嗎?
小A:你這是參數(shù)錯誤,不關 JustAuth 的問題吧?!肮奉^笑”
小B:你指定 scope 就可以了
群主大帥哥:經(jīng)老夫掐指一算,你這就是 小B 說的問題,在使用 JustAuth 的自定義 scope 功能[1]時,不建議使用所有 scope,因為部分平臺的 scope 權(quán)限需要特殊申請。你可以將自定義 scope 的配置去掉,這樣的話 JustAuth 會使用該平臺默認的 scope 進行授權(quán)。
小帥哥:哇,真的是耶!問題已經(jīng)解決了,群主真好用!
群主大帥哥:咳咳,注意用語,是 JustAuth 真好用,群主是人,不能隨便用。(^_^)
小帥哥:群主牛逼!真棒!
問題二
小帥哥:群主大帥哥,前后端分離的項目中,在登錄時 ,在 callback 里面, 是使用 response.sendRedirect 重定向到前端 登錄中間頁嗎?
小C:都分離了,為什么還要后端重定向,和后端沒關了啊,后端返回token不就可以了嗎?
群主大帥哥:這個問題非常好,解決方案可不少。你說已把文檔找,問題還是搞不了。我猜你是沒找對,要不不能這么累。進到這兒[2]看一看,絕對能把問題辦!
小帥哥:群主群主你真棒,三言兩語就敢上。這個問題弄不了,正常流程怎么搞?
小A小B小C:你倆能不能正常點?
群主大帥哥:咳咳,言歸正傳,書接上文。前后端分離的項目正常流程是這樣的:
1.第三方應用的回調(diào)地址填前端項目的可訪問地址2.后臺接口使用 JustAuth 的 request.authorize(xx) 生成授權(quán)鏈接,然后返回給前臺3.前臺獲得授權(quán)鏈接后進行跳轉(zhuǎn)4.第三方登錄完成后回調(diào)到前端項目的可訪問地址5.前端獲取回調(diào)中的 code 和 state 等參數(shù),傳回后臺,請求 token 和 userinfo
小帥哥:群主牛逼!我徹底明白了,你說的流程簡單易懂。真棒!
問題三
小帥哥:群主大帥哥,state 用默認存儲 和 redis 存儲 有何區(qū)別???我看了 名詞解解[3] 和 高級特性里面的內(nèi)容(使用 state[4]和自定義 state 緩存[5]),state 我看默認有效時間 3 分鐘, 請問這個時間對哪里有影響呢?
群主大帥哥:state的有效期對【單次授權(quán)流程長時間沒操作這個場景】有影響。一般來說用戶進行授權(quán)登錄都是實時的(即從用戶點擊授權(quán)登錄、跳轉(zhuǎn)到第三方登錄授權(quán)、回調(diào)到業(yè)務系統(tǒng)這個流程是依次順利操作的),很少遇到用戶在授權(quán)時,跳轉(zhuǎn)到第三方登錄頁面后,用戶長時間沒操作,等過了3分鐘后再進行登錄操作。這個時候 justauth 中的 state 已經(jīng)過期了,用戶在第三方登錄成功回調(diào)到業(yè)務系統(tǒng)后,會授權(quán)失敗。會提示state無效。這個時候就需要用戶重新登錄授權(quán)
小帥哥:明白了, 就是控制用戶第三方登錄的有效時間。
群主大帥哥:可以這么理解。state 是一次使用的,不可能讓它長期滯留緩存。不過這個過期時間你可以根據(jù)你們自己的需要進行調(diào)整。你如果覺得這個時間短,那你可以調(diào)長一點,比如10分鐘過期。
小帥哥:state 只要是隨機數(shù)就行是吧?
群主大帥哥:對,隨機數(shù)。
(大帥哥正在碼字的時候)
小帥哥:bind:uuid 這樣可以嗎,因為想回調(diào)時好區(qū)分是綁定還是登錄。
群主大帥哥:很棒,你已經(jīng)會搶答了!確實可以這么操作,即在用戶進行綁定的時候可以使用用戶 id。
小帥哥:是 justauth 太棒了!接下來有時間 想研究下大佬的升級作品 JAP[6]。
群主大帥哥:完全沒問題!JAP 是一款開源的登錄認證中間件,基于模塊化設計,為所有需要登錄認證的 WEB 應用提供一套標準的技術解決方案,開發(fā)者可以基于 JAP 適配絕大多數(shù)的 WEB 系統(tǒng)(自有系統(tǒng)、聯(lián)邦協(xié)議)。Just auth into any app!
小帥哥:哇!這么棒!那 JAP 有什么功能和優(yōu)勢?
群主大帥哥:好問題!本文最后我會給你詳細解釋。
群主大帥哥:前面提到可以用 UID 充當 state ,不過不建議直接使用 UID,最好用 id+隨機數(shù)加密(要求可解密)后進行傳輸。state 是保證流程安全的,它就是為了防止 csrf 攻擊的,如果你直接用用戶id,也是可能存在被攻擊的情況。比如這個回調(diào)請求被攔截后把state 替換成了攻擊者的id,這個時候就會出問題。
小帥哥:行,我用md5 加密下。
群主大帥哥:額....,你md5加密后咋解密?不解密你咋知道是哪個用戶的id?或者你還是用隨機數(shù),你本地把用戶id和隨機數(shù)關聯(lián)起來就行。
小帥哥:了解了, 為安全起見,用 對稱加密 (AES) 對用戶id 加密, 回調(diào)時 解密該id。同時校驗該 id 合法性(是否存在),綁定當前用戶信息。
群主大帥哥:你真棒!
小帥哥:群主牛逼!真棒!
關于 JAP
JAP 是什么?
JAP 是一款開源的登錄認證中間件,基于模塊化設計,為所有需要登錄認證的 WEB 應用提供一套標準的技術解決方案,開發(fā)者可以基于 JAP 適配絕大多數(shù)的 WEB 系統(tǒng)(自有系統(tǒng)、聯(lián)邦協(xié)議)。
JAP 有哪些功能?

JAP 有什么優(yōu)勢?
?易用性:JAP 的 API 沿襲 JustAuth 的簡單性,做到了開箱即用的程度。JAP 高度抽象各種登錄場景,提供了多套簡單使用的 API,極大程度的降低了開發(fā)者的學習成本和使用成本?全面性:JAP 全量適配 JustAuth 支持的第三方平臺,實現(xiàn)第三方登錄。同時也支持所有基于標準OAuth2.0 協(xié)議或者 OIDC 協(xié)議或者 SAML 協(xié)議的應用、系統(tǒng),同時 JAP 還提供不同語言版本的項目 SDK,適配多種研發(fā)場景?模塊化:JAP 基于模塊化設計開發(fā),針對每一種登錄場景,比如賬號密碼、OAuth、OIDC等,都單獨提供了獨有的模塊化解決方案?標準化:JAP 和業(yè)務完全解耦,將登錄認證相關的邏輯抽象出一套標準的技術解決方案,針對每一種業(yè)務場景,比如用戶登錄、驗證密碼、創(chuàng)建并綁定第三方系統(tǒng)的賬號等,都提供了一套標準的策略或者接口,開發(fā)者可以基于 JAP,靈活并方便的完成相關業(yè)務邏輯的開發(fā)和適配?通用性:JAP 不僅可以用到第三方登錄、OAuth授權(quán)、OIDC認證等業(yè)務場景,還能適配開發(fā)者現(xiàn)有的業(yè)務系統(tǒng)的普通賬號密碼的登錄場景,基本將所有登錄相關的業(yè)務場景都已經(jīng)涵蓋。針對 WEB 應用,JAP 將提供滿足各種不同登錄場景的解決方案(和開發(fā)語言無關)
JAP 適用于哪些場景?
JAP 適用于所有需要登錄認證功能的場景。比如:?要求規(guī)范:新項目立項,你們需要研發(fā)一套包含登錄、認證的系統(tǒng),并且從長遠方面考慮,你們需要一套標準的、靈活的、功能全面的登錄認證功能。?需求靈活:現(xiàn)有登錄模塊為自研,但是新一輪的技術規(guī)劃中,你們想將登錄認證模塊重構(gòu),以更加靈活的架構(gòu)適應后面的新需求,比如:集成 MFA 登錄、集成 OAuth 登錄、SAML登錄等。?力求省事:你們的項目太多(或者是開發(fā)語言較多,比如:Java、Python、Node 等),每個項目都需要登錄認證模塊,想解決這種重復勞動的問題,使研發(fā)人員有更多的時間和精力投入到業(yè)務開發(fā)中,提高研發(fā)產(chǎn)能和研發(fā)效率。關于 JAP 的更多內(nèi)容,可以參考《JAP 產(chǎn)品技術白皮書[7]》
相關鏈接
?Gitee:https://gitee.com/fujieid/jap?Github:https://github.com/fujieid/jap?CodeChina:https://codechina.csdn.net/fujieid/jap?開發(fā)者文檔:https://justauth.plus引用鏈接
[1] 自定義 scope 功能: https://justauth.wiki/features/customize-scopes.html[2] 這兒: https://justauth.wiki/perfect_articles.html[3] 名詞解解: https://justauth.wiki/quickstart/explain.html[4] 使用 state: https://justauth.wiki/features/using-state.html[5] 自定義 state 緩存: https://justauth.wiki/features/customize-the-state-cache.html[6] JAP: https://gitee.com/fujieid/jap[7] JAP 產(chǎn)品技術白皮書: https://justauth.plus/paper/JAP-paper-V1.0.0.pdf
