---
# System prepended metadata

title: OAuth 2.0

---

# OAuth 2.0 
- 透過JWT (RFC 7519) & Bearer (RFC 6750)實作Access token
- https://swagger.io/docs/specification/authentication/bearer-authentication/

## JWT介紹
- JWT 是 JSON 的開放標準 (RFC 7519)
- 由三個部分組成，用逗點隔開組成一串字串
  `Header`.`Payload`.`Signature`

### Header
```json
{
  "alg": "HS256", // 加密的方法: HMAC、SHA256、RSA
  "typ": "JWT"    // 聲明類型
}
```
### Payload

- **Registered claims** : 預先定義好的屬性，有功能性
    - iss, sub, iat, exp .....
- **Public claims** : 已公開註冊在 IANA "JSON Web Token Claims"
- **Private claims** : 自定義屬性

```json
{
  "iss":"xx server",      //誰簽發的
  "sub": "22933",        //subject(建議是unique)
  "name": "Peter Chou",  //自訂屬性
  "iat": 1516239022,    //簽發時間
  "exp": 1518999999     //過期時間
}
```

### Signature
由header, payload 產生
```c
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), 'secret')
```

最後三個部分用base64加密後用`.`連接，可以得到JWT
```json w!
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJ4eCBzZXJ2ZXIiLCJzdWIiOiIyMjkzMyIsIm5hbWUiOiJQZXRlciBDaG91IiwiaWF0IjoxNTE2MjM5MDIyLCJleHAiOjE1MTg5OTk5OTl9.TiiQdUlt25djArBNrKnGtW26BI_akmEyqHQxPMhJZcc
```
![](https://i.imgur.com/8eScn4W.png)



## 適用場景
### JWT (無狀態)
- 一次性驗證 (ex: email驗證信)
- restful api的無狀態認證

JWT無狀態認證的方式更適合橫向擴展的server
對不同台server只需要驗證token內容是否正確
很適合seesion需要跨server 跨domain的情況

需要考量的點: 續簽、廢棄

### 傳統的session+cookie (有狀態)
- 持續性的狀態檢查
- 可控制的狀態 

like 購物車 會員登入

## Ref
- https://mgleon08.github.io/blog/2018/07/16/jwt/
- https://pjchender.dev/internet/note-oauth2/
- https://ithelp.ithome.com.tw/articles/10197166
- https://oauth.net/2/bearer-tokens/
