Skip to content

Commit 01be6b6

Browse files
committed
docs: new authentication RFC
1 parent 027abda commit 01be6b6

File tree

1 file changed

+88
-8
lines changed

1 file changed

+88
-8
lines changed

httpapi/auth/README.md

Lines changed: 88 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,25 +2,105 @@
22

33
Auth 端點提供適合供網頁應用程式使用的認證 API。
44

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+
578
## 登出帳號
679

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`
886

987
如果 Token 撤回失敗,則會回傳 HTTP 500 錯誤並帶上錯誤資訊:
1088

1189
```json
1290
{
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."
1593
}
1694
```
1795

18-
如果 Token 撤回成功,則回傳 HTTP 205 (Reset Content),此時您可以重新整理登入狀態。
96+
如果 Token 撤回成功,則回傳 HTTP 200 OK,此時您可以重新整理登入狀態。
1997

20-
如果沒有 Auth Token 或者是 token 無效,則依然回傳 HTTP 205。請引導使用者重新登入。
98+
如果沒有 Auth Token 或者是 token 無效,則依然回傳 HTTP 200。請引導使用者重新登入。
2199

22-
## Google 登入
100+
## 參考來源
23101

24-
如果您要觸發 Google 登入的流程,請前往 `GET /api/auth/google/login`。可以帶入 `redirect_uri` 參數來在登入完成後轉導到指定畫面。
102+
為了保證登入時的資訊安全,這裡參考了兩份 RFC 進行 API 的設計:
25103

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

Comments
 (0)