iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
生成式 AI

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

【Day 9】認證授權全上線:修完 Bug 還得防 AI 改壞程式

  • 分享至 

  • xImage
  •  

今天是鐵人賽第九天,目標是請 AI 同事協助建構「認證與授權工具」。

一開始,我先請他規劃建構步驟,再要求他以後端工程師的角度補強優化。中間遇到可選的實作方式時,我會讓他用一問一答的形式提供選項,並分析優缺點,讓我評估採用哪一種方案。這次也順便修改了容器中敏感資料的讀取方式,改成更安全的方式來讀取 key 與密碼。

接著,我依照建議升級了 Python 版本與容器的 image 版本號,並調整了 pytest 中引用程式碼的部分。這些小改動對 AI 同事來說依然駕輕就熟。完成後,我嘗試建立後端的 Docker 容器,但因為 Python 專案的資料夾結構與容器內不同而出錯。請 AI 同事調整後,後端終於能正常啟動。

之後,我讓他提供一份手動測試計畫,測試內容包含:

  • API 文件介面可訪問性
  • 使用者註冊
  • 使用者登入(取得 Access Token)
  • 使用 Access Token 訪問受保護的端點
  • 錯誤處理(未授權/禁止訪問)

結果和我預想的差不多——AI 同事在建構功能時,幾乎每個環節都會有或多或少的錯誤,必須一步步檢查細節並要求他修正,才能讓功能正常運作。

遇到的問題與修正:

  • API 文件介面可訪問性:部分 API 路徑錯誤,已修正。
  • 使用者註冊:會錯誤回傳 hash_password,已修正。
  • 使用者登入:因套件版本問題,替換套件並修改相關程式碼。
  • 訪問受保護端點:能正確取得 Token,但測試頁面僅支援密碼登入,不過登入後查詢受保護資料是正確的。
  • 錯誤處理(未授權/禁止訪問):未登入時能正確顯示未授權訊息。

完成全部功能測試並修正部分 Bug 後,我將進度更新到檔案並用 Git 進行版本控制。

最後發生一個小插曲——在做 Git 操作時,可能因為對話文本太久沒清,AI 同事突然又跳回去處理之前的錯誤,結果差點把程式碼改壞。好在我馬上提醒那個問題已經解決,而且正準備上傳到 GitHub,他也聽話地把程式碼還原,不然我真的會吐血 XD。

今天一次要做的功能太多,加上 Bug 修正,導致找不到適合的斷點來清空舊文本。下次規劃時,我可能得讓 AI 同事以更小的顆粒度設計功能,不然一旦中途插入錯誤程式碼,又得花大把時間去收拾殘局 XD。

以下為今天的研究流程


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

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

了解完之後,請AI同事先計畫今天進度的內容。
我給AI的指令:

幫我計畫 認證與授權工具的開發

等AI同事做出一版計畫後,我又請他以後端工程師的角度做出建議。
我給AI的指令:

 @agents/engineering/backend-architect.md 請以你的角度對這個計劃做出建議

AI同事又對一些安全的細節做出建議,例如Access Token與Refresh Token的時效、撤銷機制、使用流程、黑名單的持久性考量、標準化錯誤處理等等,加強了他一開始的計畫未談到的細節。

接下來我請AI同事用一問一答方式,去釐清
我給AI的指令:

請用一問一答的方式來討論這些細節,並在問題時給出一些選項,並幫忙分析優缺點

在一問一答的過程中,討論了JWT 的 SECRET_KEY的管理方式、如何在不增加效能負擔的情況下施行追蹤修改,等內容,中間AI同事提出的選項也可以討論是否有替代或補救方案,AI同事根據我跟他討論的內容優化建構計畫。

最後決定透過Docker Compose Secrets去管理敏感資料,不過先透過模擬 secrets的方式去實現,等未來主要功能都建構好再回來使用Docker Swarm去管理。
AI同事開始幫我建構,其中我也做了一些手動調整,後端因為我是用python建構所以他選了一個python環境的image,但如果python與其套件的版本跟外面我們的venv環境不同,可能會造成外面可以執行,進dokcer就會出錯,因此我請AI同事去輸出venv內套件的版本,讓他重新選擇docker的image,並安裝我們使用的套件版本。
我給AI的指令:

請幫我找出與我venv環境一致的環境,並透過將venv內的套件版本輸出 @backend/requirements.txt去讓docker內的python環境盡量貼近venv的python環境 

不過AI同事說他沒辦法直接操作,給我步驟請我幫忙。主要指令為
1.進入venv環境: .\backend\venv\Scripts\activate
2.輸出python版本: python --version
3.輸出python套件版本: pip freeze > requirements.txt

AI同事根據我給他的資訊,重新修改了docker-compose.yml的檔案內容,
不過在建立的時候,AI同事突然說我python3.8.5有點太舊,可能需要更新,我想那就趁現在更新吧
畢竟這種東西,越早更新越好,等之後功能都建好了反而不好更新了
我請AI同事透過context7幫我查最新支援的版本。
我給AI的指令:

以我目前使用的應用程式,最新python版本多少可以支援,請用context7去查

AI同事幫我查了之後給我的回應。

根據網路搜尋結果,FastAPI 支援 Python 3.6 及以上版本,包括 Python 3.7、3.8、3.9、3.10 等較新版本。根據 PyPI頁面和最新的 GitHub 發布資訊,FastAPI 也支援 Python 3.12 和 3.13。
因此,您的應用程式(使用 FastAPI)目前可以支援的最新 Python 版本是 Python 3.13。

雖然我對於直接用最新的版本有點怕怕的,因為假如在建構的功能有用到比較舊或者後來沒在維護的套件,他可能用法改變了或者不支援了,容易造成程式出錯,不過我想畢竟這是鐵人賽挑戰,而且維持較新的版本也可以減少漏洞的發生,因此我決定聽從AI同事的建議安裝python3.13的版本。

到官網安裝好後,調整一下python的環境變數,重開命令提示字元重載環境變數後,可以正常啟動pytohn3.13.6。
接下來重新建立venv環境。
1.建立python環境:python -m venv backend/venv
2.啟動環境:.\backend\venv\Scripts\activate
3.安裝套件:pip install -r backend/requirements.txt

這樣就將python更新到最新版本了,也順便請AI同事幫我調整pytest的內容符合之前改的讀取方式,在容器內用secret機制,在venv執行則讀取env的內容,測試後能正常執行。

接下來嘗試將後端容器架起來,但在 docker-compose up --build執行後,出現錯誤訊息。
我請AI同事幫我看是什麼問題,

使用者回報 Docker 容器內的 backend 服務出現 ImportError:
backend-1 | ImportError: attempted relative import with no known parent package
此錯誤發生在
backend-1 | File "/app/main.py", line 3, in
backend-1 | from .database import create_db_and_tables。
這通常發生在使用相對導入的 Python 腳本被直接作為頂層腳本運行,而不是作為套件中的模組導入時。

這個問題看來是比較容易解決的,就是程式在呼叫其他程式時,因為位置的關係無法透過import去呼叫,他幫我移到正確的位置後就正常啟動後端。

接下來我請AI同事給我手動測試計畫:

  • API 文件介面可訪問性
  • 使用者註冊
  • 使用者登入 (獲取 Access Token)
  • 訪問受保護的端點 (使用 Access Token)
  • 錯誤處理 (未授權/禁止訪問)

測試項目一:API 文件介面可訪問性 (確認應用程式運行)
結果第一步就有問題,裡面沒有出現 /auth/register, /auth/login 這兩個節點。
我請AI同事幫忙修正這個問題,我下的指令為:

 http://localhost:8000/docs#/ 上面沒有 /auth/register, /auth/login, 只有 /token , /register

他根據我的內容去添加prefix="/auth",讓路徑如我預期。

測試項目二:使用者註冊
解決完第一個測試項目的問題後,接下來測試使用者註冊功能。
結果由於AI同事誤用User用法,他註冊完回傳的資料包含了hash_password,這算蠻嚴重的資安問題,因此我請AI同事去修改這個錯誤,他建立了另一個UserRead去只回傳我們想回傳的內容,避免敏感資料流出。

測試項目三:使用者登入 (獲取 Access Token)
我測試密碼登入成功,雖然取得token但無法使用,看了一下後端log發現,由於之前更新python版本,bcrypt與 passlib部分出現了相容性問題,因此我請他用context7去找出相依賴的版本,結果沒有。後來AI同事透過google_web_search搜索才發現crypt已經在3.13移除,因此只能使用其他替代套件去處理。
接下來就是修復換套就後的程式碼,大概重複出現錯誤,將關鍵錯誤貼給AI同事去修,啟動出現其他錯誤,再請AI同事去修這個流程。
這時卡比較久的是pwdlib套件import的Argon2Hasher與BcryptHasher的方法。
因為這是比較新的解決方案,AI同事一直使用錯誤的方式import,我直接手動去搜索解決方式,並請AI同事使用我的方法去解決,才終於解決這個問題。

測試項目四:訪問受保護的端點 (使用密碼登入)
雖然正常取得token,但測試頁只有密碼登入,因為不影響正常功能使用,就先用密碼登入去側,這邊就正常出現了。

測試項目五:錯誤處理 (未授權/禁止訪問)
這邊是測試登出後能否看到受保護的端點,測試是正常禁止非使用者取得資料。

全部測試成功,將資訊更新到檔案並做git版本控制。


上一篇
【Day 8】每到穩定就記錄:與 AI 長期合作的自保策略
下一篇
【Day 10】死循環驚魂後,AI 同事帶我完成使用者管理與重構
系列文
30 天與 AI 同事打造系統的求生實錄30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言