常見驗證流程

API key only

項目內容
主要資料表api_keys
常見程式ApiValidation::assertApiKey() / hasValidApiKey()
代表身份client/app
user id 來源

規則:API key 只代表呼叫端合法,不代表登入使用者。

User session

項目內容
主要資料表api_sessions, users
常見程式ApiValidation::assertApiSession() / hasValidApiSession()
代表身份登入使用者
user id 來源$usersDO->id

簡化流程:

$usersDO = null;
$passed = ApiValidation::hasValidApiSession($request, true, $usersDO);
if ($passed && $usersDO !== null) {
    $userId = (int)$usersDO->id;
}

Session access side effect

Legacy RestApiHelper::hasValidApiSession() 通過後不只是驗證 session,還會更新 users 的 access 欄位。搬移需要保留時,要把它視為 legacy session helper 的副作用,而不是單一 API 的 business logic。

欄位 / 行為說明
users.iphone_last_access歷史命名;不只 iPhone,Web / iOS / Android 等 valid API session 都會更新為本次 request 時間。
users.last_access_client本次 API key 對應的平台,例如 webiosandroid
task_queue.returnedQuoteService若 user 是專家、iphone_last_access 超過 180 天且有 active service,legacy 會條件式寫入。

相近欄位不要混用:

  • last_logged_in_time:偏登入 / 建 session 時間。
  • last_login_ip_id:最後登入 IP。
  • iphone_last_request:其他 request / phone confirm 相關時間,不是一般 session access。

Legacy 來源:get-lancer-php56/app/Controller/RestApiHelper.php::hasValidApiSession()
New 搬移時若是為了對齊 legacy,可用專用 helper 或明確命名的 method 保留,例如 applyLegacyApiSessionSideEffects();不要因為 endpoint 是 read-only 就自行移除。

Security hash

項目內容
主要資料表security_hashes, 目標資源表
常見程式SecurityHash::getByHash($model, $hash)
代表身份hash 授權的資源 owner
user id 來源security_hashes.user_id

規則:hash 不是存在目標主表,而是存在 security_hashes。要再用 model + foreign_id 指回目標資源。

Hash first, session fallback

順序規則user id
1有 hash 時先查 security_hashes通過後用 security_hashes.user_id
2hash 的 foreign_id 必須等於目標資源 id不符合就不通過
3hash 不通過才檢查 session通過後用 $usersDO->id
4hash 和 session 都失敗invalid session