IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬
前言
接著IdentityServer4的授權模式繼續聊,這篇來說說 Resource Owner Password Credentials授權模式,這種模式在實際應用場景中使用的并不多,只怪其太開放啦,直接在客戶端上拿著用戶名和密碼就去授權服務器獲取AccessToken,這樣容易被客戶端拿著用戶名和密碼搞壞事;接下來就詳細說說。
正文
Resource Owner Password Credentials授權模式與上一節說到的客戶端憑據模式不同,這是有用戶參與的,用戶就是資源擁有者;通過允許在客戶端使用用戶名和密碼的方式向授權服務器獲取AccessToken,AccessToken和用戶相關,即不同的用戶獲取到的AccessToken不一樣。
術語解釋:
Resource Owner:資源所有者,即擁有資源的用戶;絕大對數小伙伴都應該有自己的QQ,如果沒特殊情況,相信每一個小伙伴的QQ空間中都有自己曾經覺得很酷或很有紀念意義的照片,這里的照片就是資源,而小伙伴就是資源所有者。QQ服務器就是資源服務器。
Resource Owner Password Credentials 流程
流程簡要說明:
首先用戶和客戶端需要提前在授權服務器上備案過的,用戶沒有備案,在資源服務器肯定就沒有對應的資源,客戶端沒有備案就不能隨意去授權服務器獲取AccessToken;
用戶在客戶端上輸入用戶名和密碼,并帶上備案過的客戶端憑據一起請求授權服務器獲取AccessToken;
授權服務器驗證用戶憑據和客戶端憑據,成功之后直接返回代表該用戶的AccessToken;
用戶在操作時,帶上AccessToken訪問資源服務器;
資源服務器正常返回結果,如果沒有AccessToken是不能訪問受保護資源的;
結合流程,看看代碼如何實現,步伐跟上哦;
這里資源服務器和授權服務器就拷貝之前客戶端模式的代碼(這樣每種模式的代碼區分開,方便查看),在原有基礎上修改代碼即可;
代碼地址:https://github.com/zyq025/IDS4Demo
>>在原有的授權服務器上增加代碼
模擬在授權服務器中備案用戶,方便測試效果,就在內存中模擬;
備案新的客戶端,指定其授權方式;
好啦,到這授權服務器的修改就完成啦,用postman先測試一下;
>>授權服務器修改完啦,資源服務器不用動,那就到客戶端啦
新建一個Winform窗體程序,簡單布局安排上;并引入IdentityModel包;
編寫獲取AccessToken邏輯,在GetAccessToken按鈕點擊事件中增加代碼,如下:
先啟動授權服務器,看看access_token運行效果,如下:
獲取到AccessToken之后就可以訪問受保護的API啦,在調用API按鈕點擊事件中進行邏輯編寫,如下:
授權服務器、資源服務器、客戶端啟動運行看效果,如下:
以上就是Resource Owner Password Credentials的使用,流程是不是很簡單。接下來聊聊這種模式的其他話題;
Resource Owner Password Credentials的尷尬之處
在oauth2.0中如果使用這種模式,規定是不允許客戶端存儲資源所有者的用戶名和密碼的,但如果是第三方客戶端想搞事情,就把用戶信息先存一把,這樣就導致間接泄露用戶信息的風險很高(如果第三方客戶端被攻擊了),這也是這種模式在實際應用場景使用比較少的原因,如果有其他模式選擇,不建議使用此模式;
通常以下情況,可以考慮使用:
客戶端是可高度信任的,且安全性要有保障;
遺留應用,沒有其他好的解決方案,可以使用;
有用戶參與獲取的accessToken和客戶端憑據獲取到的有什么區別
之前客戶端憑據模式的截圖:
資源所有者密碼模式的截圖:
小伙伴肯定看出來不止多一個,但其中比較重要的就是sub這個claim,如果sub存在,調用API的access_token就能區分是代表用戶的,否則就是代表客戶端的。即有用戶參與獲取的acess_token是代表用戶的,每個用戶的token都不一樣。
refresh_token得補上
refresh_token是為了給access_token進行延長有效期而存在的,為了安全和降低風險,access_token的有效期一般設置的比較短,通常會是兩個小時(根據需要設置),當access_token失效時,常規的做法就是讓其跳轉到登錄頁重新登錄獲取,這樣頻繁的跳轉到登錄頁,用戶體驗及其不好,為避免這種情況,需對access_token進行在線續命,即延長有效期;實現的方案各種各樣,比如有在前端定時檢測的,也有在后端做有效判斷的,但用的相對比較多還是使用refresh_token的形式,當access_token失效時,會采用refresh_token去請求新的access_token,保證用戶正常操作。
如果需要在獲取access_token的時候同時返回refresh_token,需要在授權服務器上備案客戶端時將AllowOfflineAccess設置為true,如下所示:
refresh_token具體使用,在后續的案例單獨說吧。
總結
關于Resource Owner Password Credentials 就簡單說這么多,主要是看看如何使用,相信小伙伴在新的項目中應該會很少用到,畢竟拿著用戶名和密碼直接在第三方客戶端搞事情,始終還是有風險;下一篇說說Implicit(簡化模式)。
源碼地址:https://github.com/zyq025/IDS4Demo
一個被程序搞丑的帥小伙,關注"Code綜藝圈",跟我一起學~
總結
以上是生活随笔為你收集整理的IdentityServer4 之 Resource Owner Password Credentials 其实有点尴尬的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轻量级 Kubernetes K3s -
- 下一篇: Xamarin使XRPC实现接口/委托远