第7章封面圖:Section 07 API使用申請與授權審核

這章要學會什麼

  • 讓會員對一個已發布的版本提出使用申請,填寫用途、希望的有效期間、每日額度與權限範圍。
  • 說明「審核結果」跟「使用權」為什麼分開存放,並在同一個頁面把兩者並排顯示給會員看。
  • 核准的同一個交易裡完成「申請標為核准+寫審核紀錄+建立使用權」,並讓管理員可以核准比申請更短的期間或更少的額度。
  • 用資料庫規則擋住重複送出、重複核准,並實測兩個同時發生的請求真的只會產生一筆使用權。
  • 撤銷使用權時只改授權狀態,原本的申請與核准紀錄完全不受影響。

先備知識

要先完成第 6 章:已經有服務發布出來可以申請。理解上一章的「版本號欄位」跟「衝突例外」,本章會用同樣的模式再做一次類似的併發保護。

觀念白話講

為什麼註冊之後,還要另外提出申請

第 1 章講過的驗收金句:「註冊成功不代表能呼叫 API」。這一章把它變成真正的程式:會員要呼叫某個已發布的版本,必須先提出申請、說明用途,由管理員判斷是否合理,核准後系統才會建立一筆「使用權」。管理員看得到申請人填的用途、希望的期間跟額度,可以核准、把數字調低,或直接駁回。

申請跟使用權都綁定明確的版本,不是綁服務名稱——舊版核准了,提供者之後發布的新版本仍然要重新申請,新版本不會自動繼承舊版的核准。

申請要填什麼

欄位合法範圍為什麼需要
用途10~500 字管理員判斷是否核准的主要依據
希望的有效期間1~365 天使用權一定有到期日,沒有「永久有效」這種選項
希望的每日額度1~10000 次以臺灣日期為單位計次,用完當天就拒絕
權限範圍目前只有「呼叫工具」這一種使用權允許做什麼;之後的通行證也要帶著同樣的權限範圍才能呼叫

管理員核准時可以把期間跟額度調低,但絕不能超過申請時填的數字——會員沒開口要的權限,不應該被主動給予。

審核結果,跟使用權,分開存放

一件使用申請的完整生命週期:申請進入待審→管理者審核→核准的話同時建立審核紀錄跟一筆使用中的使用權,駁回的話只建立審核紀錄、不產生使用權→之後使用權可能被撤銷或到期而失效,但申請本身仍然是「已核准」的狀態、不會被改變。
圖 7-1 一件使用申請的完整生命週期:申請進入待審→管理者審核→核准的話同時建立審核紀錄跟一筆使用中的使用權,駁回的話只建立審核紀錄、不產生使用權→之後使用權可能被撤銷或到期而失效,但申請本身仍然是「已核准」的狀態、不會被改變。

看這張圖要注意重點:撤銷或到期時,改變的只有使用權,申請本身永遠維持「已核准」的紀錄。這樣分開存放有三個好處:①稽核方便——半年後查「當初為什麼准了」,答案在審核紀錄裡,就算使用權早已撤銷;②判斷「現在能不能用」只需要看使用權這一張表,不必翻歷史;③撤銷後如果想重新申請,可以產生全新的一組申請與使用權,舊的那一組完整保留當作歷史紀錄。

怎麼防止重複:送出與核准

情況可能發生什麼防線
連按兩次「送出申請」產生兩件一模一樣的待審申請資料庫的唯一性限制:同一人對同一版本,待審狀態只能有一件
已經有有效使用權,又提出申請同一版本兩筆有效授權,額度變相加倍送出申請前先檢查「有沒有已存在的有效使用權」
兩位管理員同時核准可能產生兩筆使用權版本號比對+資料庫唯一性限制雙重防線(跟第 6 章相同的手法)
管理員事後又按一次核准可能再多一筆使用權核准前先確認案件必須還是「待審」狀態

唯一性限制擋的只是「待審中」的重複,已經核准或已經駁回的申請不受這個限制——所以駁回後可以重新申請,撤銷後也可以重新申請。

老師示範做了什麼

示範情境:一位會員對某個服務提出使用申請;管理員審核另一位會員的重新申請,並且把額度調低;最後在「我的申請與授權」和後臺「使用權管理」兩個畫面,看審核結果跟使用權如何分開呈現。

使用申請表單:標題旁清楚寫著要申請的是哪個版本、提供者是誰;用途說明至少要 10 字;期間跟額度有預設值、權限範圍固定只有一個選項;說明文字提醒「管理員可以核准比申請更短的期間或更少的額度」。
圖 7-2 使用申請表單:標題旁清楚寫著要申請的是哪個版本、提供者是誰;用途說明至少要 10 字;期間跟額度有預設值、權限範圍固定只有一個選項;說明文字提醒「管理員可以核准比申請更短的期間或更少的額度」。
管理員審核一件使用申請:左欄顯示申請內容跟版本目前的狀態;右上「核准天數」「核准每日額度」預設就是申請時填的數字,但伺服器端仍會驗證不能超過申請值;右下是必填的駁回理由。
圖 7-3 管理員審核一件使用申請:左欄顯示申請內容跟版本目前的狀態;右上「核准天數」「核准每日額度」預設就是申請時填的數字,但伺服器端仍會驗證不能超過申請值;右下是必填的駁回理由。
會員看自己的申請結果與目前授權:每一筆申請左右分兩欄——左欄是「申請結果」、右欄是「目前授權」;同一筆申請可能左欄顯示已核准,右欄卻顯示已撤銷,這正是圖 7-1 的重點:申請結果不變,使用權失效了。
圖 7-4 會員看自己的申請結果與目前授權:每一筆申請左右分兩欄——左欄是「申請結果」、右欄是「目前授權」;同一筆申請可能左欄顯示已核准,右欄卻顯示已撤銷,這正是圖 7-1 的重點:申請結果不變,使用權失效了。
後臺使用權管理:每一列都指回它的來源申請;顯示有效期間、狀態(有效/已撤銷附原因/已到期);只有仍然有效的使用權才有撤銷欄位,原因空白送出會被拒絕。
圖 7-5 後臺使用權管理:每一列都指回它的來源申請;顯示有效期間、狀態(有效/已撤銷附原因/已到期);只有仍然有效的使用權才有撤銷欄位,原因空白送出會被拒絕。

老師特別帶大家看一個真實案例:某位會員之前申請並取得了一支服務的使用權,後來被管理員以「用途已結束」為由撤銷。當這位會員重新申請時,「我的申請與授權」頁上會同時出現兩筆紀錄——舊的一筆(已核准/已撤銷)完整保留,新的一筆(審核中/尚無授權)獨立產生,兩者互不影響。

自己動手的步驟

步驟一:申請的權限範圍與併發保護

幫使用申請資料表加上「權限範圍」欄位跟「版本號」欄位,並加一個帶篩選條件的唯一性限制:同一個人對同一個版本,只能有一件待審中的申請。

步驟二:送出申請

會員送出申請前,服務層要逐一檢查:版本必須是已發布狀態(審核中、已下架的版本一律拒絕);用途、天數、額度、權限範圍都要落在合法範圍內;如果已經有一筆有效期使用權,就直接拒絕(避免額度被相加)。這些檢查都不信任前端表單,因為表單驗證可以被繞過,一定要在伺服器端重新做一次。

步驟三:審核與撤銷

核准、駁回共用的前提檢查:申請必須還是待審狀態、審核者不能是申請人本人;核准時另外要求版本仍然是已發布狀態(如果服務已經下架,只能駁回、不能核准,讓案件可以結案)。核准的動作要在同一次存檔裡完成「申請改為已核准」「新增審核紀錄」「新增使用權(有效期從現在起算)」三件事。撤銷則只做三件事:把使用權狀態改成已撤銷、記下撤銷時間與原因、寫一筆稽核紀錄——完全不去動申請與審核紀錄。

步驟四:個人進度與使用權管理頁面

「我的申請與授權」頁要把每一件申請跟它可能產生的使用權排在同一列顯示,即使某些申請還沒有審核結果、或被駁回而沒有使用權,也要能正常顯示出來(用資料庫的「外部連接」查詢手法,讓沒有配對到資料的那一側顯示空白,而不是整列消失)。

常見錯誤

症狀原因怎麼處理
審核頁打開得到技術性錯誤把篩選條件寫在「已經包裝成顯示用格式」之後,資料庫查詢工具不知道欄位怎麼對應先對原始資料做篩選跟排序,最後一步才轉換成顯示用的格式
重複申請時終端機出現底層資料庫錯誤訊息同一人對同一版本已經有一件待審申請這是唯一性限制在正常運作,畫面上呈現的是友善的提示訊息,底層日誌不必特別處理
使用權的編號不連續交易被回復,或撞到唯一性限制時,資料庫已經配出去的流水號不會被收回正常現象;不要用編號是否連續來判斷資料有沒有遺失

怎麼驗收+反向驗證

  1. 核准才會建立使用權:送出一件申請後查詢,使用權筆數是 0;核准後變成 1;被駁回的申請則始終是 0。
  2. 同一案件重複送出不會建立重複申請:同一個版本連續送出兩次(包含同時送出),待審中的申請只會有 1 件。
  3. 同一案件重複核准不會建立重複權限:兩個工作階段同時核准同一件申請,一個成功、一個得到衝突訊息;事後再核准一次得到「不能重複審核」。使用權跟審核紀錄對這件申請都應該各只有 1 筆。
  4. 反向驗證:直接對資料庫嘗試替一件已經有使用權的申請再新增一筆使用權,必須被唯一性限制擋下。
← 上一章 回課程地圖 下一章 →