iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
生成式 AI

30 天與 AI 同事打造系統的求生實錄系列 第 13

【Day 13】從帳密到 Bearer:和 AI 同事的一場認證迷宮探險

  • 分享至 

  • xImage
  •  

今天是鐵人賽第十三天。

昨天 AI 同事建構了不少功能,今天打算先把那些功能都完整測試過,再繼續往下走。
果不其然,一啟動就出現了不少錯誤,而且不曉得是不是 Gemini 更新的關係,今天的 AI 同事感覺比前幾天還要笨──遇到很多基礎錯誤,甚至檔案內容都有種「沒讀完整」的感覺。

我先花時間修復了一些 import 錯誤,還有 AI 同事在修 bug 時誤改的地方,以及 pip install 的快取機制問題。處理完後,總算讓後端容器成功啟動,可以開始手動測試。

測試到第二步時,因為我複製訊息錯了,按下 esc 中斷後重新輸入正確訊息,結果 AI 同事直接跳出 400 錯誤,提示:

Please ensure that the number of function response parts is equal to the number of function  call parts of the function call turn.

我只好用 /clear 清除舊文本,重新讓他一步一步帶我手動測試並確認結果。前半段測試很順利,但測到 refresh_token 時卡住了——我的 FastAPI docs 只有帳密登入方式,無法直接測 token。

我問 AI 同事,他一直堅稱有一個輸入框只是我沒看到。耐心耗盡後,我轉而請小幫手 ChatGPT 提供解法,把方案貼給 AI 同事。來回兩次後,AI 同事終於意識到必須在 main.py 做修改才能用 token 登入。

但修改後還是無法顯示 token 輸入框,我只好再把程式碼貼給 ChatGPT,小幫手立刻指出問題:

app.openapi_extra 在 FastAPI 本身並不會自動合併到 Swagger UI 的 securitySchemes
要讓它顯示 Bearer token 欄位,需要用 自訂 OpenAPI schema 的方式注入 securitySchemes,並覆蓋 app.openapi

我把提醒轉告給 AI 同事,他馬上就懂該怎麼改,並再度修正程式。
這次果然成功出現了 BearerAuth (http, Bearer),但又冒出新問題——雖然 Authorize 按鈕有 token 登入選項,但登入後並沒有套用到其他 API 節點。AI 同事才說,因為我沒有定義哪些路徑要使用它。

我們先替 users 加上 tags,再告訴 Swagger UI 這些路徑需要 token 登入,但依然無效。
最後我又請出 ChatGPT,小幫手發現我還在用 OAuth2PasswordBearer 當 token 來源,所以 Swagger UI 還是認為要用帳密登入,並建議全部改成 HTTPBearer

改完後,帳密登入功能消失了,但原本 users 節點依然沒有出現 token 登入,只有 auth 有。
我請 AI 同事檢查這兩個節點的差異,嘗試了幾種方法仍未解決,只好先把這個問題留到明天再戰。

以下為今天的研究流程


首先開始前的老樣子,請AI同事了解應用現況。
我給AI的指令:

@ai_context.md @README.md @軟體核心架構規劃.md @功能需求總覽.md   了解目前現況

再來我請AI同事設計昨天功能的手動測試功能
我給AI的指令:

請幫我設計昨天更新的功能的手動測試流程

AI同事幫我設計了七大項測試,不過一次太多我不好操作,我請他一步一步來。
我給AI的指令:

請帶我一步一步測試,使用 http://localhost/docs 來測試,請引導我測試每一項並跟我確認是否通過測試

AI開始一步步的帶我測試並確認。

一開始遇到的錯誤是backend/config.py 檔案中,refresh_token_expire_days 這個設定值沒有被正確讀取到,我請AI同事更新生成用的程式scripts/generate_secrets.py後執行成功。
確認後除了生成地方減少,AI同事之前也遺漏掉docker-compose.yml也需要增加相關參數。
接下來出現下一個錯誤缺少redis套件,看來昨天因為一口氣大量建置,出現了不少類似這種細節錯誤。
這次我請AI同事用context7去查套件相依來找適合的redis版本安裝
我給AI的指令:

請使用context7去查詢目前套件相依最適合的redis版本并新增進 @backend/requirements.txt 

最後他綜合我的套件相依以及我redis資料庫的版本,選擇了redis=5.0.0的套件版本號。
處理完這個問題,繼續處理下一個問題,找不到python找不到backend路徑。
又出現failed to solve: no build stage in current context
AI同事修了幾次後,建議我先清除快取重開docker再試一次。
我清除後重啟還是一樣的訊息,請他重新讀一次Dockerfile,結果發現他之前修改時,把image那段蓋掉了,所以才出現沒有東西建置的錯誤。
這個部分解決之後,終於能正常架設後端容器,但python套件快取機制還是有問題,我拿去問除錯小幫手ChatGPT,他說是我在執行pip install之前,先執行了COPY /app,導致他每次都以為requirements.txt有變動導致每次都重新下載,修改後快取機制就正常了。

在測試時,AI同事出現了400錯誤,看來是之前中斷時出現錯誤,我使用clear指令清除文本後,重新測試流程。
我給AI的指令:

請幫我計畫昨天建構功能的手動測試,目前後端容器都啟動成功,使用http://localhost/docs 去測試,請一步一步帶我測試,並跟我確認是否正確

一開始測試蠻順利的,後來要測試refresh_token功能時,我找不到可以用token的地方,他預設是帳密登入,我請AI同事去調整Swagger UI的授權設定,但AI同事一直告訴我說會有一個輸入框可以輸入,但我看還是沒有,只好在求救修bug助手ChatGpt幫忙了,我將部分相關程式碼跟說明告訴ChatGPT,在將他給的建議貼回我的AI同事,讓他們兩個透過我來做協作。
AI同事修改了main.py有關 app.openapi_extra的參數部分,但我重啟後在docs網站上還是沒看到token輸入框,我將更新內容貼給助手ChatGPT:

59 - app.include_router(auth.router, prefix="/auth", tags=["Auth"]) # Add prefix and tags for  better documentation                                                                   59 + app.include_router(auth.router, prefix="/auth", tags=["Auth"])                         60
61 + # Add security scheme for Bearer token                                                 62 + app.openapi_extra = {                                                                   63 +     "components": {                                                                     64 +         "securitySchemes": {                                                           65 +             "BearerAuth": {                                                             66 +                 "type": "http",                                                         67 +                 "scheme": "bearer",                                                     68 +                 "bearerFormat": "JWT",                                                 69 +                 "description": "Enter your JWT token in the format 'Bearer <token>'"   70 +             }                                                                           71 +         }                                                                               72 +     },                                                                                 73 +     "security": [{"BearerAuth": []}] # Apply BearerAuth globally                       74 + } # Add prefix and tags for better documentation                                       75 +    

修改完還是沒有出現

小幫手ChatGPT馬上看出來原因,他回復我:

我懂你遇到的情況了,
app.openapi_extra 這個屬性在 FastAPI 本身並不會自動合併到 Swagger UI 的 securitySchemes,
所以你加了 app.openapi_extra,Swagger 還是不會顯示 Bearer token 欄位。
要讓它真的顯示,需要用 自訂 OpenAPI schema 的方式,把 securitySchemes 注入,然後覆蓋 app.openapi。

果然只有AI才懂AI,AI同事立刻聽懂,並根據小幫手AI的指正去修改內容出現了token登入。
但現在出現另一個問題,token登入目前只套用在auth節點。我請AI同事檢查:
我給AI的指令:

現在users節點的帳密登入消失了,但是token登入還是沒有出現。token登入還是只出現在auth節點,請幫我檢查這兩個節點的差異,為什麼只有auth節點有token登入輸入框  

他測試了幾個方法,但還是無法解決只好先將這個問題留給明天解決了。


上一篇
【Day 12】AI 同事步伐太大,我的人工檢查差點跟不上
下一篇
【Day 14】Swagger UI的鎖頭迷思:從 OAuth2 到 HTTPBearer 的認證探索
系列文
30 天與 AI 同事打造系統的求生實錄30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言