--- 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 登入 流程圖 ![](https://i.imgur.com/mbrEfEu.jpg) ## 驗證在後端驗證 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 需要再驗證一次