|
2 | 2 |
|
3 | 3 | Auth 端點提供適合供網頁應用程式使用的認證 API。 |
4 | 4 |
|
| 5 | +## 登入帳號 |
| 6 | + |
| 7 | +使用 `GET /api/auth/v2/authorize/google` 登入帳號。 |
| 8 | + |
| 9 | +GET 時,您需要帶入這些查詢參數 (query string): |
| 10 | + |
| 11 | +- `response_type`:目前只支援授權碼模式,必須是 `code` |
| 12 | +- `redirect_uri`:要接收 token 的 callback endpoint,比如 `https://www.dbplay.app/api/auth/callback` |
| 13 | +- `state`:要傳給 redirect URI 的狀態參數 |
| 14 | +- `code_challenge`:雜湊後的授權碼,在 callback 中取回 token 時會用到。 |
| 15 | +- `code_challenge_method`:必須是 `S256` |
| 16 | + |
| 17 | +`code_challenge` 的雜湊方式如下: |
| 18 | + |
| 19 | +```plain |
| 20 | +code_challenge = BASE64URL-ENCODE(SHA256(ASCII(code_verifier))) |
| 21 | +``` |
| 22 | + |
| 23 | +登入完成後,會自動跳轉到 `redirect_uri` 上,接著您可以在 redirect URI(下稱 callback)中取回 token。 |
| 24 | + |
| 25 | +### Callback 會收到的參數 |
| 26 | + |
| 27 | +在驗證完成後,瀏覽器會跳轉到 `redirect_uri`,並帶入以下的查詢字串: |
| 28 | + |
| 29 | +- `code`:取回 token 的授權碼 |
| 30 | +- `state`:你在〈登入帳號〉中傳入的狀態參數 |
| 31 | +- `code_challenge`:你在〈登入帳號〉中傳入的雜湊授權碼 |
| 32 | +- `code_challenge_method`:你在〈登入帳號〉中傳入的雜湊授權碼 |
| 33 | + |
| 34 | +接著您可以使用〈取回 token〉API 來取得 token。 |
| 35 | + |
| 36 | +如果登入失敗,則是會帶入以下的查詢字串: |
| 37 | + |
| 38 | +- `error`:錯誤代碼 |
| 39 | +- `error_description`:錯誤描述 |
| 40 | + |
| 41 | +## 取回 token |
| 42 | + |
| 43 | +使用 `POST /api/auth/v2/token` 取回 token。 |
| 44 | + |
| 45 | +POST 時,您需要帶入這些查詢參數 (query string): |
| 46 | + |
| 47 | +- `grant_type`:目前只支援授權碼模式,必須是 `authorization_code` |
| 48 | +- `code`:你在 `redirect_uri` 收到的授權碼 |
| 49 | +- `redirect_uri`:重新導向連結,必須與〈登入帳號〉的 redirect URI 相同 |
| 50 | + |
| 51 | +如果一切順利的話,會回傳 token、token type、過期時間等資訊: |
| 52 | + |
| 53 | +```json |
| 54 | +{ |
| 55 | + "token_type": "Bearer", |
| 56 | + "access_token": "2YotnFZFEjr1zCsicMWpAA", |
| 57 | + "expires_in": 28800 |
| 58 | +} |
| 59 | +``` |
| 60 | + |
| 61 | +## 授權 |
| 62 | + |
| 63 | +請將 access token 帶入 `Authorization` 標頭中,格式如下: |
| 64 | + |
| 65 | +```plain |
| 66 | +Authorization: Bearer <access_token> |
| 67 | +``` |
| 68 | + |
| 69 | +預設 `access_token` 會存活 8 小時,且只要 token 有人存取就會延長。 |
| 70 | + |
| 71 | +如果需要登出的話,除了使用〈登出帳號〉API 撤銷特定 token 外,也可以使用 GraphQL 的批次撤銷來處理。 |
| 72 | + |
5 | 73 | ## 登出帳號 |
6 | 74 |
|
7 | | -您可以使用 `POST /api/logout` 登出帳號。 |
| 75 | +您可以使用 `POST /api/auth/v2/revoke` 登出帳號。 |
| 76 | + |
| 77 | +需要帶入以 `application/x-www-form-urlencoded` 編碼的請求體: |
| 78 | + |
| 79 | +- `token`:要 revoke 的 token |
| 80 | +- `token_type_hint`:必須是 `access_token` |
8 | 81 |
|
9 | 82 | 如果 Token 撤回失敗,則會回傳 HTTP 500 錯誤並帶上錯誤資訊: |
10 | 83 |
|
11 | 84 | ```json |
12 | 85 | { |
13 | | - "error": "Failed to revoke the token. Please try again later.", |
14 | | - "detail": "(error details)", |
| 86 | + "error": "server_error", |
| 87 | + "error_description": "Failed to revoke the token. Please try again later." |
15 | 88 | } |
16 | 89 | ``` |
17 | 90 |
|
18 | | -如果 Token 撤回成功,則回傳 HTTP 205 (Reset Content),此時您可以重新整理登入狀態。 |
| 91 | +如果 Token 撤回成功,則回傳 HTTP 200 OK,此時您可以重新整理登入狀態。 |
19 | 92 |
|
20 | | -如果沒有 Auth Token 或者是 token 無效,則依然回傳 HTTP 205。請引導使用者重新登入。 |
| 93 | +如果沒有 Auth Token 或者是 token 無效,則依然回傳 HTTP 200。請引導使用者重新登入。 |
21 | 94 |
|
22 | | -## Google 登入 |
| 95 | +## 參考來源 |
23 | 96 |
|
24 | | -如果您要觸發 Google 登入的流程,請前往 `GET /api/auth/google/login`。可以帶入 `redirect_uri` 參數來在登入完成後轉導到指定畫面。 |
| 97 | +為了保證登入時的資訊安全,這裡參考了兩份 RFC 進行 API 的設計: |
25 | 98 |
|
26 | | -這個頁面會重新導向到 Google 的登入頁面,登入後會回到 `POST /api/auth/google/callback` 並進行帳號登入和註冊手續。 |
| 99 | +- [RFC 6749 – The OAuth 2.0 Authorization Framework](https://datatracker.ietf.org/doc/html/rfc6749#autoid-35) |
| 100 | +- [RFC 7636 – Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1) |
| 101 | +- [RFC 7009 – OAuth 2.0 Token Revocation](https://datatracker.ietf.org/doc/html/rfc7009) |
0 commit comments