# 前言
第三方登入筆記
- 使用 Laravel Socialite Provider 取得 user info
- FB 開發者登入, 用案主/公司的帳號建立一個應用程式
- 前端/APP端使用 SDK, 使用應用程式編號 & 應用程式密鑰來取得
使用者的 access token
- 前端將 OAuth 取得的 access token 丟給後端
- 透過 token 取得 user info 的 code example 可參考
/Users/ray/code/fun-marketing-backend/vendor/laravel/socialite/src/Two/FacebookProvider.php
- 後端呼叫 debug API, 參數為
使用者的 access token
以及應用程式的 access token
, 驗證使用者 access token
合法性 - 呼叫 debug API 的 response 可以取得應用程式編號, 這邊可以驗證是否跟我們的應用程式編號一致 (通常是一致)
- 細節 code example 可以參考 fun-marketing 專案的 FacebookService class, checkTokenValidity method
- 使用 Laravel Socialite Provider 取得 user info
- 請案主/公司建立 GCP 專案
API和服務 -> 資訊主頁 -> 啟用 API 和服務 -> 啟用 Google+ API 服務
- 設定 OAuth 同意畫面, 這邊具體可以參考這篇文章, 若失效可以 Google 一下
- 由於 Google 憑證, 採用一種平台一個憑證的方式, 因此假如有 iOS, Android, web 三種平台都會使用到 Google login, 那就會需要申請三種憑證 (Android 是使用 web 憑證, 這點我也很疑惑)
- 前端 (不管是 APP 端還是 web 端統稱前端) 會使用自己所屬的憑證, 將用戶導向 OAuth 頁面, 取得該用戶的 Access token
- 由於會有多個前端, 所以會有多組 client id, 當後端在驗證 token 合法性的時候, 會需要知道該平台所屬的 client id, 因此前端需要提供給後端 client id 以及 id token
- 後端可使用 Google SDK 來驗證 id token 的合法性, 需要的參數為 client id 以及 id token, code example 可參考
/Users/ray/code/fun-marketing-backend/app/Services/GoogleService.php
, 從文件會發現前端多帶一個 access token, 這是在上個版本用其他的驗證方式, 後面更新了新的驗證方式, 但 iOS 更新都要上版審核, 因此保留前端接口, 後端取而不用
# Apple
- 使用 Laravel Socialite Provider 取得 user info
- 安裝 Socialite Apple Provider, 可參考文件
- 第一種流程: 由前端或 APP 拿到 code 後直接丟給後端, 由後端拿著 code 去跟 Apple 拿資料, 這種方式主要適合 server side render 或只有一個第三方, 要是雙平台可能就不適用, 因為
用 authorization code 跟 Apple 取得使用者資料會需要 client secret
, 而 client secret 是由 private key, team_id, client_id, key_id 這些資訊封裝成一個 JWT, 問題就在於 client id 是會隨著平台變動的, 比如 iOS 會使用 app id, 但 web 就會使用 service id, 所以當雙平台都要實作 apple login 時, 這種流程就不適用 - 第二種流程: 這種流程基本上就不使用 Socialite 了, 因為 Socialite 主要是後端拿 authorization code 去跟 apple 端取 user info, 因此會需要上面提到的 client secret。 這種流程靠前端取得 identify_token, 後端只負責驗證 token 合法性, 若合法便可直接拿 token 中的 user info 來用
- Apple login 驗證比較複雜, 首先第一步要先取得 public key, 因為 apple id token 是用 asymmetic 方式簽發的, apple 用 private key 簽, 而我們用 public key 來驗證, 蘋果文件 有提供 url 取得 JWKs
- 取得 JWKs 後, 可使用其中的 n 以及 e 參數, 來還原出 public key
- 取得 public key 後, 便可用該 public key 來驗證該 id token 是否合法, 完整流程可參考專案
/Users/ray/code/fun-marketing-backend/app/Services/AppleService.php, valdiateIdToken()
- 完整資訊可參考這邊文章, 我覺得寫得很棒
- 若使用流程一, 則需使用 gem 安裝 jwt 套件, 使用 script 來產生 client secret, secret 位於
/Users/ray/code/fun-marketing-backend/ignore_me/client_secret.rb
留言