背景
18年公司準備在技術上進行轉型,而公司技術團隊是互相獨立的,新技術的推進阻力很大。咱們須要找到一個切入點。公司的項目不少,而各個系統之間又不互通,致使每套系統都有一套登陸體系,給員工和客戶都帶來極大的不便。那麼從登陸切入進去無疑最合適,對於各個團隊的技術改形成本也不大。因此咱們團隊第一個項目就是搭建一套統一登陸認證受權系統,那麼葫蘆藤項目應運而生。前端
技術方案
後端框架:.NET Core3.1(後期會推出 .NET 5版本)mysql
前端框架:Reactgit
數據庫:mysql(可根據實際狀況,自由切換)github
中間件:redisweb
詳細功能
認證受權服務
基於IdentityServer4實現的協議,支持網站、本地應用、移動端、web服務等應用的認證受權邏輯。redis
單點登陸登出
支持各類類型應用上的單點登陸登出。開箱即用的基礎用戶管理模塊,包括:註冊、登陸、手機驗證碼、忘記密碼等。爲了安全考慮,集成了騰訊圖形驗證碼。sql
第三方登陸(微信、釘釘)
完善的第三方登陸支持。支持首次登陸時綁定已存在用戶或註冊新用戶後,自動綁定。數據庫
如何快速使用
1.下載代碼
clone代碼到本地。根目錄結構以下:npm
其中,backend存放的是後端代碼,frontend存放的是前端代碼。json
進入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