---
# System prepended metadata

title: Refresh token
tags: [v2]

---

---
title: Refresh token
tags: v2
---

# Refresh token

## 現況
- 目前有使用套件 [jose](https://github.com/panva/jose/tree/688ab7f888af8bd7d3e98b301c625f842449473e) 來產生 access token 給前端使用
- token 內在 jwt id 有帶入 hash(帳號 + 密碼)，藉此檢查 user 是否更改過密碼

## 需求
- 需要 refresh token 來讓 user 可以不用一直被登出，可以自動刷新 access token

## 規劃
- refresh token 設定過期時間為 3 天
- jwt id 也使用 hash(帳號 + 密碼)，藉此檢查 user 是否更改過密碼，避免 user 更改過密碼卻還可以拿到 access token
- private key 是否用一樣的？ 
    - 好像可以


## 如何 refresh token
1. 登入後回傳 access token, refresh token
2. 新開一隻 API，拿 refresh token 來刷新 access token，並獲得新的 refresh token

## API

### pseudocod
```javascript=
check(refreshToken)
if(ok) {
    generate new accessToken
    generate new refreshToken
    req.session.access_token = new accessToken;
    req.session.refreshToken = new refreshToken;
    update old refreshToken to new refreshToken
}
```
[POST] `/api/v2/authentication/refresh-token` 
- 帶入 cookie 即可
```json=
Input: {
}

Output: {
    access_token: String,
    refresh_token: String
}
```


```javascript=
檢查 accessToken 
if(accessToken 過期) {
    檢查 refreshToken
    if (refreshToken 過期) {
        return null // 請重新登入
    }
    // refresh access and refresh token
    generate new accessToken
    generate new refreshToken
}
```

