#### 測試帳號
##### Admin User
username : admin
password : admin
在打 /user 拿到的 role 為 admin
##### Normal User without read auth
username : user_1
password : 1
在打 /user 拿到的 role 為 no_auth
##### Normal User with read auth
username : user_2
password : 2
在打 /user 拿到的 role 為 read_role
## 註冊
此 query 會 response token 在 cookie 請記得從 cookie 拿新的 token
### 請求
`POST /register`
```json
{
"username": "testuser",
"email": "testuser@example.com",
"password": "testpassword"
}
```
請前端那邊檢查信箱格式跟密碼格式
密碼規則:使用者密碼強度(密碼長度 12 個字元以上、組成字元必須包含英文大寫、小寫及數字。
### 響應
#### 成功
狀態碼:200 OK
```json
{
"message": "ok"
}
```
#### 失敗
狀態碼:400 Bad Request
```json
{
"detail": "Username already exists"
}
```
## 登入
此 query 會 response token 在 cookie 請記得從 cookie 拿新的 token
### 請求
`POST /login`
```json
{
"username": "testuser",
"password": "testpassword"
}
```
### 響應
#### 成功
狀態碼:200 OK
```json
{
"message": "ok"
}
```
#### 失敗
狀態碼:401 Unauthorized
```json
{
"detail": "Invalid username or password"
}
```
登入失敗三次後,會顯示以下資料:現在設定是一分鐘後就解除封鎖
狀態碼:401 Unauthorized
```json
{
"detail": "Too many failed login attempts. Please try again 15 mins later."
}
```
## 登出
我會讓原本的 token 無法使用,所以你清不清除都沒關係
登出後應該就回到登入註冊頁面
### 請求
`GET /logout`
### 響應
#### 成功
狀態碼:200 OK
```json
{
"message": "ok"
}
```
## 更改密碼
此 query 會 response token 請記得從 cookie 拿新的 token
### 請求
`PUT /change_password`
```json
{
"old_password": "testpassword",
"new_password": "newpassword"
}
```
### 響應
#### 成功
狀態碼:200 OK
```json
{
"message": "ok"
}
```
#### 失敗
狀態碼:401 Unauthorized
```json
{
"detail": "Invalid password"
}
```
狀態碼:400 Bad Request
```json
{
"detail": "Password used in the past 3 changes"
}
```
## 獲取使用者列表
### 請求
需要有 admin 權限的人才可以,我這邊會檢查
`GET /users_list`
### 響應
#### 成功
狀態碼:200 OK
```json
{
"users_list": [
{
"username": "testuser1",
"email": "testuser1@example.com",
"role": "user"
},
{
"username": "testuser2",
"email": "testuser2@example.com",
"role": "user"
}
]
}
```
#### 失敗
狀態碼:403 Forbidden
```json
{
"detail": "Forbidden"
}
```
## 獲取當前使用者
你可以從 token 解出 user info
### 請求
`GET /user`
### 響應
#### 成功
狀態碼:200 OK
```json
{
"username": "testuser",
"email": "testuser@example.com",
"role": "user"
}
```
## 刪除使用者
只有 admin 才可以做這件事
### 請求
`DELETE /user/{username}`
### 響應
#### 成功
狀態碼:200 OK
```json
{
"message": "User deleted successfully"
}
```
#### 失敗
狀態碼:403 Forbidden
```json
{
"detail": "Forbidden"
}
```
## 更新使用者
只有 admin 可以做這件事
### 請求
`PUT /user`
這三個欄位缺一不可,即便沒改也要帶
```json
{
"username": "testuser",
"email": "testuser@example.com",
"role": "admin"
}
```
### 響應
#### 成功
狀態碼:200 OK
```json
{
"message": "User updated successfully"
}
```
#### 失敗
狀態碼:400 Bad Request
```json
{
"detail": "Error with ..."
}
```
## 管理者頁面
打 `/users_list` api 拿到所有使用者資料後,
應該就可以建立一個表格,像是下面這樣
| username | email | 表格讀取權限 |
| -------- | ----- | ----------------------------- |
| user_1 | abd@mial | 有權限就打勾 |
等於說如果 admin 的人,把勾從 V 取消,則 put `/user`
帶
```
{
"username": "user_1",
"email": "abd@mial ",
"role": "no_auth"
}
```
反之,如果把沒打勾的打勾則變成
```
{
"username": "user_1",
"email": "abd@mial ",
"role": "read_role"
}
```