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