解決 Facebook OAuth 取得的大頭貼只有 30 天有效期限


網站或 APP 串接 Facebook OAuth 時可以取得使用者的大頭貼網址:

https://platform-lookaside.fbsbx.com/platform/profilepic/?asid=123&width=200&ext=1667382347&hash=AeTdjJ1n2Apidj8bCL8
從網址參數裡可以看到 ext,ext 是一個時間戳(Timestamp),代表過了那個時間點連結就會變成 404 Not Found,轉換後是授權日的 30 天後,為了避免 30 天後就讀取不到,解決方法有以下兩種:
  • Facebook 有提供一個網址可利用取得到的 user id 直接 302 轉跳至最新的頭貼網址,缺點是頭貼會隨著用戶的 Facebook 大頭貼改變而改變。
  • 轉存到自己 Server 或 GCS(Google Cloud Storage)/Amazon S3,缺點是會增加額外儲存成本。

萬用網址


  • 大尺寸 https://graph.facebook.com/{userId}/picture?type=large
  • 中尺寸 https://graph.facebook.com/{userId}/picture?type=normal
  • 小尺寸 https://graph.facebook.com/{userId}/picture?type=small

轉存


PHP 透過 URL 下載檔案至本地伺服器

參考:
https://stackoverflow.com/questions/11442442/get-user-profile-picture-by-id
https://stackoverflow.com/questions/34580136/facebook-app-login-how-to-control-expiration-date-of-an-image-url-i-got