天天看點

fastapi mongo_鑒權系統:基于FastAPI的快速OAuth2實作

項目介紹

背景

本人最近在學習使用FastAPI搭建一些應用的後端架構,FastAPI簡單易用,性能強悍,是以使用體驗還是較為良好的。

其中,官網的

Advanced Security

裡講到了基于

jwt

OAuth2

認證(FastAPI-OAuth2[1]),由于自身對鑒權系統的不夠了解,再加上官網此處的寫法十分進階與抽象,是以耗費了大量的時間。

現在,基于我的研究,對作者的代碼重新整理,降低其耦合度,封裝成了标準的可開箱即用的項目結構,供大家學習使用。

貢獻

官網的教程,其實已經很詳細了,相較于官網的示例,本項目有以下改進:

  • 使用了基于裝飾器(而非Depends)的通路權限控制,相較官網更易了解
  • 對接了真實的資料庫(我特設的資料庫),可直接使用(求不攻擊)
  • 簡單封裝了CRUD的傳回結果
  • 獨立出jwt、pwd兩個子產品,邏輯更清晰
  • 參考作者的template,使用了model、crud、router的app結構

計劃

企業的鑒權系統十分重要,但現在有很多開箱即用的成熟架構,比如Spring體系中就也預設使用jwt的OAuth2系統,在絕大多數情況下,已經能夠滿足企業級的使用需求,無需投入更多精力,尤其是微服務應用中。

基于以上認知,該程式後續會進一步完善,但沒有太大意義去把它做成一個python專用的、更友善的認證系統。

本項目更适合希望使用python實作企業級認證系統的程式員研究使用,更精确地說,是想使用FastAPI的。

TODO

  • [ ] 建立user_v2的app,加入FastAPI内置的Bear認證,以進一步提高OpenAPI的調試體驗
  • [ ] 導入之前寫好的mongo優化子產品(解決_id問題)
  • [ ] 加入修改密碼的測試

項目結構

使用說明

推薦安裝方式(使用虛拟環境)

進入工作目錄

配置

修改你的使用者資訊

進入

settings.py

,修改

DefaultUser

下的資訊字段,尤其是

username

字段,該字段必須唯一,否則注冊時會顯示注冊失敗,影響你的後續體驗

修改你的秘鑰

使用

openssl rand -hex 32

指令,生成你自己的

JWT_SK

秘鑰,該秘鑰是

jwt

機制最重要的的保障,必須在服務端妥善存儲,防止洩露。

生産環境中,要将秘鑰寫入環境變量中,而非源碼裡。

運作方法一(推薦)

在目前目錄下,

如下:

fastapi mongo_鑒權系統:基于FastAPI的快速OAuth2實作

指令行運作啟動截圖

運作方法二

直接運作

main.py

fastapi mongo_鑒權系統:基于FastAPI的快速OAuth2實作

直接運作啟動截圖

通路OpenAPI

運作成功後,點選對應網址(預設:

http://127.0.0.1:8000

,在其字尾加上

/docs

,可通路到OpenAPI頁面

OpenAPI調試

本API結構

本API目前隻包含一個獨立的應用,即

user

,已經包含了如下功能:

  • 使用者注冊(基于使用者名、密碼、昵稱、權限參數)
  • 使用者登入(基于使用者名、密碼,得到token,然後基于token)
  • 使用者檢視自己的資訊(基于token,預設權限

    user:read

    )
  • 使用者修改自己的資訊(基于token,預設權限

    user:write

    (注冊時需要手動添加))
  • 使用者删除自己的資訊(基于token,預設權限

    user:delete

    (背景已做限制))

OpenAPI使用說明

圖檔連結在OpenAPI頁面均是失效的,但可以去Github或Gitee浏覽。
  • Github連結[2]
  • Gitee連結[3]

1. 遊客注冊

點選

使用者注冊

,點選

Try it out

,修改輸入框中的一些資訊,然後點選

Executive

fastapi mongo_鑒權系統:基于FastAPI的快速OAuth2實作

register

2. 使用使用者名與密碼進行登入

點選

使用者登入

,其他同上,然後複制獲得的

token

fastapi mongo_鑒權系統:基于FastAPI的快速OAuth2實作

login

3. 測試使用token進行使用者通路

點選

使用者檢視

,将

token

複制到

authorization-

中,其他同上。

(注意,标準的請求頭字段應該是

Authorization

,這裡主要是因為Swagger的一些系統原因,不得不改成一個别名,詳情參考:fastapi-security-oauth2[4])

fastapi mongo_鑒權系統:基于FastAPI的快速OAuth2實作

read

4. 測試使用token進行使用者修改

點選

使用者修改

,其他同上。由于我在系統中對使用者修改的api加入了

user:write

字段檢驗,而注冊時預設沒有加入該字段,是以會傳回權限不夠的結果。

如果想讓這個接口可以使用,重新注冊一個賬戶,并且在注冊資訊

scopes

字段中加入

user:write

fastapi mongo_鑒權系統:基于FastAPI的快速OAuth2實作

write

5. 測試使用token進行使用者登出

點選

使用者登出

,其他同上。傳回結果如下,原因已經解釋了。

綜上,基于jwt、OAuth2、前端和後端,可以實作非常複雜的鑒權系統,滿足不同種業務的需求。

fastapi mongo_鑒權系統:基于FastAPI的快速OAuth2實作

delete

OpenAPI簡介

OpenAPI基于流行的SwaggerUI,用于快速生成項目的API前端展示系統,友善程式開發人員與部分體驗成員使用。

自建版體驗網址

南川OAuth2體驗網址[5]

參考資料

[1]

FastAPI-OAuth2: https://fastapi.tiangolo.com/advanced/security/oauth2-scopes/

[2]

Github連結: https://github.com/MarkShawn2020/oauth2-py

[3]

Gitee連結: ttps://gitee.com/MarkShawn2020/oauth2-py

[4]

fastapi-security-oauth2: https/github.cotiangolfastapissue612

[5]

南川OAuth2體驗網址: oauth2.nanchuan.site