---
# System prepended metadata

title: Untitled

---


#### 測試帳號

##### 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"
}
```