第三方登入

# 前言

第三方登入筆記


# Facebook

  • 使用 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

# Google

  • 使用 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
資料結構 - Heap - PHP 實作 Laravel - 高併發

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×