項目介紹
背景
本人最近在學習使用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
機制最重要的的保障,必須在服務端妥善存儲,防止洩露。
生産環境中,要将秘鑰寫入環境變量中,而非源碼裡。
運作方法一(推薦)
在目前目錄下,
如下:
指令行運作啟動截圖
運作方法二
直接運作
main.py
直接運作啟動截圖
通路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
。
register
2. 使用使用者名與密碼進行登入
點選
使用者登入
,其他同上,然後複制獲得的
token
。
login
3. 測試使用token進行使用者通路
點選
使用者檢視
,将
token
複制到
authorization-
中,其他同上。
(注意,标準的請求頭字段應該是
Authorization
,這裡主要是因為Swagger的一些系統原因,不得不改成一個别名,詳情參考:fastapi-security-oauth2[4])
read
4. 測試使用token進行使用者修改
點選
使用者修改
,其他同上。由于我在系統中對使用者修改的api加入了
user:write
字段檢驗,而注冊時預設沒有加入該字段,是以會傳回權限不夠的結果。
如果想讓這個接口可以使用,重新注冊一個賬戶,并且在注冊資訊
scopes
字段中加入
user:write
。
write
5. 測試使用token進行使用者登出
點選
使用者登出
,其他同上。傳回結果如下,原因已經解釋了。
綜上,基于jwt、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