---
title: 串接 Google Oauth 2.0
tags: Google service
---
## 串接 Google Oauth 2.0
## 測試範例
- 串接成功 Google 會回傳一個 credential 經過 RS256 decoded 後
- header
```json
{
"alg": "RS256",
"kid": "209c057d3bdd8c08f2d5739788632673f7c6240f",
"typ": "JWT"
}
```
- payload
```json
{
"iss": "https://accounts.google.com",
"nbf": 1663740477,
"aud": "920963917085-7m9mpcaa6s611oot9h69s4k2mforlsf7.apps.googleusercontent.com",
"sub": "101459028704163888950",
"email": "mickyfiomygod@gmail.com",
"email_verified": true,
"azp": "920963917085-7m9mpcaa6s611oot9h69s4k2mforlsf7.apps.googleusercontent.com",
"name": "Micky Fan",
"picture": "https://lh3.googleusercontent.com/a/ALm5wu0dOXXDUXU2tzHLBoE9U9JJ6t8naRwr1WUj-xBk=s96-c",
"given_name": "Micky",
"family_name": "Fan",
"iat": 1663740777,
"exp": 1663744377,
"jti": "5a56b6c392bc21f3c071fdac96c810bc18ac8c20"
}
```
- VERIFY SIGNATURE
```json
RSASHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
{
"e": "AQAB",
"kty": "RSA",
"n": "1dODISmOhXR0ANYI5VmtwAGSaMNxgkMA1UkeX4Wngcv8oZFavc2Zht_gibO_SW2MpZ_KeEb0EOaoeiIphi1mvFt9fmXHE0u6g9NicYpEIVBzKserpP-pE5jBCR4QO2u5NWMGOBiu5QEbIii3kt047ml3CqIXiqkmaWogibQ1rtAjeR9CYfp6nwsLazAqJS2t_RprBuGKfTt0zRULH3uGd1GX-9Fh8sNFLI_DIPPOqJVOgviH0EQ38_d1BjuKPISka2FSKqjHfecoB_isfTJVXc5ElWxy3WsVnOE8G-JVIEM5t5UruEPpmGRIc7PCFol-6BS1DJCRiQ43EeW8x6aGiQ"
}
,
Private Key in PKCS #8, PKCS #1, or JWK string format. The key never leaves your browser.
)
```
## 規劃
1. 確認 google 授權後拿到 credential
2. verify token
3. 檢查帳號
4. 註冊成功登入或登入
## 問題
- 需不需要讓 token 過期
- 透過網頁註冊的 email 帳號與 透過 Oauth2.0 google 相同 email 登入的帳號 算不算同一個帳號
- 相同的話,缺少 email 認證,會有搶帳號的問題
- 不同的話,是否要可以綁定? username 會要不一樣,如何設計?
- 透過 Oauth2.0 登入的帳號需不需要或可不可以設定密碼
## 結論
### 認定 email 當作帳號, 同一個 email 就是同一個帳號
#### 情境一
> user 先使用 google email and password 註冊帳號, 後來使用相同的 Google email SSO 登入
此時自動幫他以 原本註冊過的帳號進行登入
#### 情境二
> user 先使用 Google SSO 登入,此時會自動幫他註冊,後來 user 使用相同的 Google email and password 嘗試註冊, 這個時候系統會認定已有此 email,將 user 檔下來
## Google SSO 登入 流程圖

## 驗證在後端驗證 credential
- google 推薦使用他的 library 做驗證
- https://developers.google.com/identity/gsi/web/guides/verify-google-id-token#using-a-google-api-client-library
## API
- username password 登入
- credential 登入
- 可以拿到email
### 原 API 加欄位 or 另開 API 給第三方登入使用
- facebook SSO 登入不需要將 token 丟到後端再驗證,可使用 facebook sdk 拿到 accessToken 然後向 facebook 要資料
- 只有 google 需要再驗證一次