9) 接口權(quán)限,swagger上鎖以及第三方登錄
打開swagger,任意訪問api,可以看到不用任何驗證就能訪問。對于絕大部系統(tǒng)而言這都是一個致命的問題。接下來我們就配置接口授權(quán)驗證,先來看一下abp里面授權(quán)驗證
“授權(quán)用于在應(yīng)用程序中判斷是否允許用戶執(zhí)行某些特定的操作.ABP擴展了ASP.NET Core 授權(quán), 將 權(quán)限 添加為自動策略并且使授權(quán)系統(tǒng)在 應(yīng)用服務(wù) 同樣可用.所以ASP.NET Core授權(quán)的功能特性和它的文檔在基于ABP的應(yīng)用程序是可用的. ”(https://docs.abp.io/zh-Hans/abp/latest/Authorization)
先來看一實現(xiàn)


可以看到只需要添加[Authorize]就可以完成簡單的授權(quán)驗證,api在沒有獲得授權(quán)的情況下返回了401,需要授權(quán)就能正常調(diào)用api
接下來配置一下 swagger里面關(guān)于 OAuth的功能,方便開發(fā)調(diào)試。
CmsWebModule里面的ConfigureServices替換AddSwaggerGen
為AddAbpSwaggerGenWithOAuth
,這里需要注意的是授權(quán)地址和作用域的值,要在openiddictapplications
表中已經(jīng)存在的數(shù)據(jù)。
appsettings.json
CmsWebModule.cs
?
在
ConfigureServices
里面將上述兩個方法使用,這時swagger授權(quán)按鈕已經(jīng)出來了(別忘記在控制添加[Authorize])。一起來看看效果

在彈出授權(quán)框時,我這里"client_id:"已經(jīng)默認填上,是因為配置了默認值(如下)
?
這里有個問題:在swagger里面退出但并沒有真正的清除登錄信息。發(fā)現(xiàn)用戶的狀態(tài)還是登錄狀態(tài),同時刷新swagger頁面時發(fā)現(xiàn)授權(quán)的狀態(tài)沒有保持。看了幾個官方的例子發(fā)現(xiàn)他們也是這樣使用的,不知道他們的有沒有這個問題(https://github.com/abpframework/abp-samples/blob/master/Ids2OpenId/src/Ids2OpenId.HttpApi.Host/Ids2OpenIdHttpApiHostModule.cs) 目前本人還未有更好的解決辦法,暫時想到解決的辦法有:
使用中間件攔截swagger頁面,在按鈕【logout】直接改成 跳轉(zhuǎn)(/account/logout),這樣也可以清除登錄信息。
使用自定義的登錄頁面,就是在進入swagger之前先驗證。 這樣就必須要使用swagger里面自帶的授權(quán)彈窗。

swagger上鎖、授權(quán)先到這里,后面找個更好的辦法再來解決。目前這樣也不影響使用。
接下來進行第三方的授權(quán)登錄,這里使用github進行身份認證。(多賬戶的統(tǒng)一登錄)
打開GitHub,進入開發(fā)者設(shè)置界面(https://github.com/settings/developers),新建一個 oAuth App,把用到的幾個參數(shù)放在appsettings.json中

多賬戶的統(tǒng)一登錄(大家可以看一下這位大佬的文章https://juejin.cn/post/6844904053411938311),這里使用的是建立一個第三方用戶表(appUserThirdAuth)用于關(guān)聯(lián)已有的用戶表(appUser) appUserThirdAuth 表字段如下
大概分析一下,第三方身份認證授權(quán)的流程(github為例,可參考官方文檔 https://docs.github.com/cn/rest/apps/oauth-applications#check-a-token )
根據(jù)參數(shù)生成GitHub重定向的地址,跳轉(zhuǎn)到GitHub登錄頁進行登錄
登錄成功之后會跳轉(zhuǎn)到我們的回調(diào)地址,回調(diào)地址會攜帶code參數(shù)
拿到code參數(shù),就可以換取到access_token
有了access_token,可以調(diào)用GitHub獲取用戶信息的接口
拿到用戶信息后
隨后就可以直接調(diào)用登錄獲取token,完成整個登錄流程
如果這個用戶已經(jīng)綁定了授權(quán)驗證(即在AppUserThirdAuth已經(jīng)有數(shù)據(jù))
如果沒用綁定則需要用戶進行登錄(沒有則注冊),登錄成功時自動綁定當前用戶認證的信息
接下來開啟代碼實站階段
先把appsettings.json里面的配置統(tǒng)一讀取,注入服務(wù)中就可以直接使用實體類 在
YiAim.Cms.Domain.Shared
新建Options文件夾,里面存放配置對應(yīng)的實體,如:AppOptions,代碼太多只展示部分
??
在CmsDomainSharedModule里面讀取配置內(nèi)容
需要使用時在構(gòu)造函數(shù)里面注入 IOptionsOptions 即可
在
YiAim.Cms.Application.Contracts
新建Authorize文件夾,然后新建IAuthorizeService,IOAuthService
??
在 YiAim.Cms.Application 里面寫實現(xiàn)請求,直接新建Authorize文件夾,新建StateManager.cs
(狀態(tài)管理器主要用于控制請求限制)、ThirdOAuthServiceBase
第三方授權(quán)的基礎(chǔ)請求服務(wù),后面的第三方授權(quán)服務(wù)都應(yīng)繼承它,GithubService
github授權(quán)服務(wù),AuthorizeService
暴露的授權(quán)服務(wù),具體看代碼實現(xiàn)
這里涉及到http請求,在構(gòu)造函數(shù)中依賴注入IHttpClientFactory,在?
ConfigureServices
里配置?context.Services.AddHttpClient()
。使用IHttpClientFactory創(chuàng)建HttpClient StateManager.cs
?
ThirdOAuthServiceBase.cs
AuthorizeService.cs
?
運行項目打開swagger就會看到 多了Authorize

測試"{type}輸入github,因為我們這里支持多平臺的授權(quán)認證,目前僅實現(xiàn)github
先調(diào)用
/oauth/github
拿到授權(quán)鏈接訪問授權(quán)鏈接到github授權(quán)服務(wù)器拿到code,state參數(shù),就可以進行獲取access token.可以看到
https://localhost:44377/account/auth?code=71757f3b53404b820602&state=dfaf1ddd4cff400ca0df41c194bc8871
?這個地址是沒有辦法跳轉(zhuǎn)過來的,因為這個地址還不存在,先手動將參數(shù)拿到將參數(shù)放到?
/oauth/{type}/token
?里進行請求就可以獲得token (演示這里沒有數(shù)據(jù)是我接口返回的問題,后面會根據(jù)實際場景調(diào)整這些接口)

有了第三方的用戶信息就可以進行我們的授權(quán)認證邏輯處理(見:第三方身份認證授權(quán)的流程),到此需要第三方授權(quán)認證的關(guān)鍵實現(xiàn)邏輯已經(jīng)實現(xiàn)的差不多了。 由于篇幅太長,本章就到此結(jié)束。下章將繼續(xù)補充完整第三方授權(quán)登錄的功能