背景
18年公司準備在技術上進行轉型,而公司技術團隊是互相獨立的,新技術的推動阻力很大。我們需要找到一個切入點。公司的專案很多,而各個系統之間又不互通,導致每套系統都有一套登入體系,給員工和客戶都帶來極大的不便。那麼從登入切入進去無疑最合適,對於各個團隊的技術改造成本也不大。所以我們團隊第一個專案就是搭建一套統一登入認證授權系統,那麼葫蘆藤專案應運而生。
技術方案
後端框架:.NET Core3.1(後期會推出 .NET 5版本)
前端框架:React
資料庫:mysql(可根據實際情況,自由切換)
中介軟體:redis
詳細功能
認證授權服務
基於IdentityServer4實現的協議,支援網站、本地應用、移動端、web服務等應用的認證授權邏輯。
單點登入登出
支援各種型別應用上的單點登入登出。開箱即用的基礎使用者管理模組,包括:註冊、登入、手機驗證碼、忘記密碼等。為了安全考慮,整合了騰訊圖形驗證碼。
第三方登入(微信、釘釘)
完善的第三方登入支援。支援首次登入時繫結已存在使用者或註冊新使用者後,自動繫結。
如何快速使用
1.下載程式碼
clone程式碼到本地。根目錄結構如下:
其中,backend存放的是後端程式碼,frontend存放的是前端程式碼。
進入backend目錄,使用Visual Studio開啟解決方案。目錄結構如下:
2.生成資料庫
首先在Fulu.Passport.Web中找到appsettings.Development.json檔案。編輯資料庫連線字串:
開啟程式包管理器,切換預設專案為:Fulu.Passport.Web, 如下圖所示:
然後在程式包管理器中執行如下命令:
Add-Migration Init
最後執行完成後,再執行如下命令:
update-database
執行完以上操作後,如沒有報錯,則會建立資料庫,並會在Client表中建立一條測試資料,如下圖所示:
3.按F5啟動後端服務
注:由於專案中依賴redis來處理快取,所以正式啟動之前,需要將appsettings.Development.json檔案裡的redis配置改為你自己的。
4.啟動前端
切換目錄到frontend,在命令列中執行如下命令:
npm install
執行完畢後,執行如下命令:
npm run demo
執行結果如下圖所示:
然後通過http://localhost:8080進行訪問。介面如下所示:
至此,前後端服務已啟動完畢,一個開箱即用的認證授權服務就完成了。
5.新客戶端如何快速接入認證服務?
認證授權服務存在的意義就是提供統一的認證授權入口,有了這個服務後,每個新的客戶端應用無需單獨開發認證授權模組。下面就來一起看下如何快速將新應用接入到認證授權服務。(此處以 ASP.NET Core作為示例,其他語言大同小異)。
示例程式碼在sample資料夾中,如下圖所示:
在正式接入之前,必須先申請應用。(此版本未提供應用管理服務)通過在資料庫中新增示例資訊,如下圖所示:
示例sql指令碼:
INSERT INTO `fulusso`.`client`(`client_secret`, `full_name`, `host_url`, `redirect_uri`, `description`, `enabled`, `id`) VALUES ('14p9ao1gxu4q3sp8ogk8bq4gkct59t9w', '葫蘆藤2', 'http://localhost:5003/', 'http://localhost:5003', NULL, 1, UUID());
其中,redirect_uri引數指的是從認證服務獲取code之後,重定向的url。為了開發的方便,我們的認證服務中僅校驗回撥域名的域名,不會校驗完整的地址。比如,你的redirect_uri為http://www.xxx.com/abc/aaa,則資料庫中的redirect_uri欄位填寫http://www.xxx.com即可。
應用資訊匯入到資料庫後,在Startup類的ConfigureServices方法中,新增如下程式碼:
services.AddServiceAuthorize(o =>
{
o.AllowClientToken = true;
o.AllowUserToken = true;
o.OnClientValidate = false;
o.Authority = "http://localhost:5000";
o.ValidateAudience = false;
o.ClientId = Configuration["AppSettings:ClientId"];
o.ClientSecret = Configuration["AppSettings:ClientSecret"];
});
注:需新增Fulu.Service.Authorize專案引用,如下圖所示:
然後在Configure方法中,新增如下程式碼:
app.UseRouting();
app.UseJwtAuthorize();
app.UseAuthorization();
其中,UseJwtAuthorize是自定義的中介軟體,為了實現OAuth2.0的授權碼的邏輯。
限於篇幅,具體程式碼不在此列出。可在程式碼倉庫中檢視。
到此為止,這個新應用就成功的接入到認證服務了。
當未登入的時候,訪問此應用的頁面會自動跳轉到認證服務的login介面。登入之後,會重定向回登入之前的頁面。如下圖所示:
下一版功能規劃
1.更多的第三方平臺的接入(QQ、微博等)
2.api授權服務
3.更安全的二次驗證,整合google令牌
4.應用管理
等等~~~~,盡請期待。
體驗
演示地址:https://account.suuyuu.cn/
程式碼倉庫:https://github.com/fuluteam/fulusso