[DOCS] 規範化 B000 認證機制並移除冗餘 API

1. [DOCS] 更新 B000 登入 API 規格,統一參數名為 Su_Account/Su_Password 並要求帶入機台 API Token。
2. [REFACTOR] 將 B000 路由移入 iot.auth 中間件,強化 API 安全性。
3. [DOCS] 移除廢棄的 B710 (時間同步) API 說明。
4. [DOCS] 調整 B014 認證與安全規範描述,使其符合現行機台引導流程。
This commit is contained in:
sky121113 2026-05-06 14:25:40 +08:00
parent 5e63370983
commit 4348a88697
4 changed files with 26 additions and 39 deletions

View File

@ -29,18 +29,20 @@ description: 本技能規範定義了 Star Cloud 系統中所有機台 (IoT) 與
## 3. 機台核心 API (IoT Endpoints) ## 3. 機台核心 API (IoT Endpoints)
### 3.1 B000: 機台本地管理員同步登入 ### 3.1 B000: 機台本地管理員同步登入
用於機台 Android 端維護人員登入與進入設定頁。此 API 無狀態,且為例外不強制檢查 Bearer Token 的端點 用於機台 Android 端維護人員登入與進入設定頁。此 API 需帶入機台 API Token 進行認證
- **URL**: POST /api/v1/app/admin/login/B000 - **URL**: POST /api/v1/app/admin/login/B000
- **Authentication**: Bearer Token (Header)
- **Headers**:
- `Content-Type: application/json`
- `Authorization: Bearer <api_token>`
- **Request Body:** - **Request Body:**
| 參數 | 類型 | 必填 | 說明 | 範例 | | 參數 | 類型 | 必填 | 說明 | 範例 |
| :--- | :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- | :--- |
| machine | String | 是 | 機台編號 (serial_no) | M-001 |
| Su_Account | String | 是 | 系統管理員或公司管理員帳號 | admin | | Su_Account | String | 是 | 系統管理員或公司管理員帳號 | admin |
| Su_Password | String | 是 | 密碼 | password123 | | Su_Password | String | 是 | 密碼 | password123 |
| ip | String | 否 | 用戶端 IP (相容舊版) | 192.168.1.100 | | ip | String | 否 | 機台本地 IP | 192.168.1.100 |
| type | String | 否 | 裝置類型代碼 (相容舊版) | 2 |
- **Response Body:** - **Response Body:**
> [!IMPORTANT] > [!IMPORTANT]
@ -281,14 +283,7 @@ description: 本技能規範定義了 Star Cloud 系統中所有機台 (IoT) 與
| :--- | :--- | :--- | :--- | :--- | | :--- | :--- | :--- | :--- | :--- |
| code | String | 是 | 會員代碼 | "MEMBER12345" | | code | String | 是 | 會員代碼 | "MEMBER12345" |
---
### 3.14 B710: 機台時間同步 (Timer Sync)
校準機台 RTC 時間。
- **URL**: POST /api/v1/app/machine/timer/B710
- **Authentication**: Bearer Token (Header)
- **Response:** 回傳當前伺服器 Unix Timestamp。
## 4. 已遷移至 MQTT 的端點索引 ## 4. 已遷移至 MQTT 的端點索引

View File

@ -19,24 +19,15 @@ class MachineAuthController extends Controller
*/ */
public function loginB000(Request $request): JsonResponse public function loginB000(Request $request): JsonResponse
{ {
// 1. 驗證欄位 (相容舊版 Java App 發送的 JSON 格式) // 1. 驗證帳密與 IP
$validated = $request->validate([ $validated = $request->validate([
'machine' => 'required|string',
'Su_Account' => 'required|string', 'Su_Account' => 'required|string',
'Su_Password' => 'required|string', 'Su_Password' => 'required|string',
'ip' => 'nullable|string', 'ip' => 'nullable|string',
'type' => 'nullable|string',
]); ]);
// 2. 取得機台物件 (需優先於帳密驗證,以便記錄日誌到正確機台) // 2. 取得機台物件 (由 iot.auth 中介層注入)
$machine = Machine::withoutGlobalScopes()->where('serial_no', $validated['machine'])->first(); $machine = $request->get('machine');
if (!$machine) {
Log::warning("B000 機台登入失敗: 伺服器找不到該機台", [
'machine_serial' => $validated['machine']
]);
return response()->json(['message' => 'Failed']);
}
// 3. 透過帳號尋找使用者 (允許使用 username 或 email) // 3. 透過帳號尋找使用者 (允許使用 username 或 email)
$user = User::where('username', $validated['Su_Account']) $user = User::where('username', $validated['Su_Account'])
@ -47,7 +38,7 @@ class MachineAuthController extends Controller
if (!$user || !Hash::check($validated['Su_Password'], $user->password)) { if (!$user || !Hash::check($validated['Su_Password'], $user->password)) {
Log::warning("B000 機台登入失敗: 帳密錯誤", [ Log::warning("B000 機台登入失敗: 帳密錯誤", [
'account' => $validated['Su_Account'], 'account' => $validated['Su_Account'],
'machine' => $validated['machine'] 'machine' => $machine->serial_no
]); ]);
// 寫入機台日誌 // 寫入機台日誌

View File

@ -14,28 +14,29 @@ return [
'slug' => 'b000-tech-login', 'slug' => 'b000-tech-login',
'method' => 'POST', 'method' => 'POST',
'path' => '/api/v1/app/admin/login/B000', 'path' => '/api/v1/app/admin/login/B000',
'description' => '機台啟動引導的第一步。維運人員輸入個人帳密與機台編號進行認證,成功後核發臨時 Token 供後續擴充使用。', 'description' => '維運人員輸入個人帳密進行認證。此 API 需帶入機台 API Token。驗證成功後核發臨時 User Token 供後續擴充使用。',
'headers' => [ 'headers' => [
'Content-Type' => 'application/json', 'Content-Type' => 'application/json',
'Authorization' => 'Bearer <machine_api_token>',
], ],
'parameters' => [ 'parameters' => [
'username' => [ 'Su_Account' => [
'type' => 'string', 'type' => 'string',
'required' => true, 'required' => true,
'description' => '維運人員帳號', 'description' => '維運人員帳號 (username/email)',
'example' => 'admin_test' 'example' => 'admin_test'
], ],
'password' => [ 'Su_Password' => [
'type' => 'string', 'type' => 'string',
'required' => true, 'required' => true,
'description' => '維運人員密碼', 'description' => '維運人員密碼',
'example' => 'password123' 'example' => 'password123'
], ],
'machine' => [ 'ip' => [
'type' => 'string', 'type' => 'string',
'required' => true, 'required' => false,
'description' => '機台序號 (Serial No)', 'description' => '機台本地 IP',
'example' => 'SN202604130001' 'example' => '192.168.1.100'
], ],
], ],
'response_parameters' => [ 'response_parameters' => [
@ -51,9 +52,9 @@ return [
], ],
], ],
'request' => [ 'request' => [
'username' => 'admin_test', 'Su_Account' => 'admin_test',
'password' => 'password123', 'Su_Password' => 'password123',
'machine' => 'SN202604130001' 'ip' => '192.168.1.100'
], ],
'response' => [ 'response' => [
'message' => 'Success', 'message' => 'Success',

View File

@ -48,15 +48,15 @@ Route::prefix('v1')->middleware(['throttle:api'])->group(function () {
| 專門用於機台通訊,頻率較高,建議搭配異步處理。 | 專門用於機台通訊,頻率較高,建議搭配異步處理。
*/ */
// 機台管理員 B000 登入驗證 (由於此階段機台未帶 Token 無法通過 iot.auth) // 機台啟動引導與參數下載 (公開存取,僅需機台序號,供機台初始化時獲取 API Token)
Route::prefix('app')->group(function () { Route::prefix('app')->group(function () {
Route::post('admin/login/B000', [\App\Http\Controllers\Api\V1\App\MachineAuthController::class, 'loginB000'])->middleware('throttle:30,1');
// 機台啟動引導與參數下載 (已改為公開存取,僅需機台序號)
Route::get('machine/setting/B014', [App\Http\Controllers\Api\V1\App\MachineController::class, 'getSettings']); Route::get('machine/setting/B014', [App\Http\Controllers\Api\V1\App\MachineController::class, 'getSettings']);
}); });
Route::prefix('app')->middleware(['iot.auth', 'throttle:100,1'])->group(function () { Route::prefix('app')->middleware(['iot.auth', 'throttle:100,1'])->group(function () {
// 機台管理員 B000 登入驗證 (需帶機台 API Token)
Route::post('admin/login/B000', [\App\Http\Controllers\Api\V1\App\MachineAuthController::class, 'loginB000'])->middleware('throttle:30,1');
// 機台狀態與相關同步 (B017, B710, B220) // 機台狀態與相關同步 (B017, B710, B220)
Route::get('machine/reload_msg/B017', [App\Http\Controllers\Api\V1\App\MachineController::class, 'getSlots']); Route::get('machine/reload_msg/B017', [App\Http\Controllers\Api\V1\App\MachineController::class, 'getSlots']);