Quantcast
Channel: WFU BLOG
Viewing all articles
Browse latest Browse all 784

FB 登入 API 只允許商家使用,如何讓 Google API 實現自動登入?

$
0
0
2023 年底前幾個月收到 FB 給開發人員的通知,提醒「登入 API」要完成「商家驗證」,否則使用權限會受到影響。果然進入 2024 後本站的「會員系統」因為使用了 FB 登入,立刻收到讀者回應,說會顯示 "應用程式錯誤" 無法進行註冊。 雖去年事先想處理此事,但看過「FB 官方文件」發現,商家驗證需要提供 "公司登記執照"、"營利事業登記證"、"政府核發的營業稅務文件"...等相關資料,沒有開公司的話根本無能為力。 查了一些資料,例如「想要串接整合 Facebook 登入/註冊功能?你得先進行 Facebook 商家驗證。」,可以確定對於 "個人" 開發者而言,想使用 FB 登入 API 已是死路一條,只能研究如何用 Google API 來取代。 由於 2024 Google 登入 API 也有一些變革,要做到跟 FB 一樣能自動登入也不是那麼容易的事,請見本篇的心得整理與實作範例。 (圖片出處: pixabay.com)

一、Google 登入 API 說明

1. 2023 Google 登入去年 Google 登入功能有一次重大變革,通知開發人員 API 必須由原本的「Google Sign-In 移轉為 Google Identity Services(GIS)」。因為操作方式及語法變化很大,已將實作範例程式碼整理到這篇「2023 新版 Google 登入 API」。 2. 2024 Google 登入今年 2024 有使用 Google 登入功能(GIS)的開發人員,都會收到這個「不使用第三方 cookie」的通知,對於操作 API 有稍微的變更,簡單摘要如下:
  • 為了改善使用者隱私,Chrome 瀏覽器會逐步不使用第三方 cookie
  • 登入時瀏覽器會顯示使用者提示
  • 參照「遷移網頁應用程式」這部份的內容,程式碼中有些方法會受到影響,例如 isDisplayMoment()、isDisplayed()、isNotDisplayed()、getNotDisplayedReason()、getSkippedReason()...
由於不使用第三方 Cookie,代表不一定能紀錄上次登入的是哪個帳號,較難實現以往使用「FB 登入 API」的自動登入效果。 3. 無痕模式的處理實測 Google 登入功能(GIS)在無痕模式下的效果:
  • 使用官方預設按鈕,點擊後可彈出登入視窗
  • 使用自訂按鈕,也許是不能使用 cookie 的關係,無法正常執行、彈出登入視窗
如果想兼容瀏覽器無痕模式,或是開發的程式比較簡單,或許使用官方預設登入按鈕即可。 但官方登入按鈕彈性較小,開發起來較不方便,我個人還是習慣用官方 Javascript API 操作自訂按鈕,所以用程式碼偵測到無痕模式時,跳出警告訊息提醒訪客不要用無痕模式。

二、Google API 如何自動登入

Google 登入功能(GIS)預設不使用「自動登入」效果,然而各大網站的會員都能自動登入,若本站讓會員每次都要手動點個幾下才能登入,著實是非常不友善的設計。為了實現以往使用「FB 登入 API」的自動登入效果,得詳細研究 Google 官方操作文件。 1. 為何 Google 無法自動登入經過我的實測,使用官方預設按鈕登入,而且啟動「自動登入」的設定,但發現重整頁面後,仍然不會記憶我上次登入的帳號,這讓我十分納悶。 後來找到官方「自動登入及登出」的說明:
自動登入必須符合下列條件...使用者必須先登入自己的 Google 帳戶...同意與您的應用程式分享帳戶設定檔...如果使用者有多個 Google 帳戶,而且造訪您的網站,就必須先登入單一 Google 帳戶,並提供該帳戶的同意聲明。
終於找到原因了,原來我的瀏覽器有多個 Google 帳號,可能現在 Google 決定不使用第三方 cookie,導致無法記憶上一次登入的帳號,那麼當我有多個 Google 帳號時,就無法自動登入了。除非我把 Google 帳號登出到只剩一個帳號,這樣才能實現「自動登入」... 對於這樣的結果我當然無法接受,哪有辦法告訴所有會員,必須先登出其他 Google 帳號才能自動登入,因此繼續研究解決方案。 2. 研究官方文件根據官網文件「使用 Google JavaScript API 登入」,可用來實作自動登入的參數有這些:
  • auto_select: 設定為 true 可以啟用自動選取功能 → 前面有提到,當使用者有多個 Google 帳號時,登入功能依然無法判定如何自動選取
  • login_hint: 如果設定了特定數值,例如 Google 帳號 email,就能自動選取該帳號執行登入
有了以上這兩個參數,就能組合起來實現自動登入。既然 API 不使用第三方 cookie 來儲存上次登入的帳號,我們可以自行儲存在 localStorage,然後利用 login_hint 讀取,轉個彎完成自動登入的效果。

三、實作範例

1. 準備動作操作 API 之前需要先建立 Google API 專案,如果還沒建立過的話,請完成以下流程: 2. 範例程式碼以下用「Bootstrap 按鈕 + jQuery」製作範例程式碼: <!--jQuery--> <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> <!--Bootstrap--> <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" /> <!--登入、登出按鈕--> <div id="GOOGLE_login"><button class="btn btn-large btn-primary">GOOGLE 登入</button></div> <div id="GOOGLE_logout"><button class="btn btn-large btn-warning">GOOGLE 登出</button></div> 目前狀態: <div id="GOOGLE_status"></div> <script> let autoLoginGoogleAccount = localStorage.autoLoginGoogleAccount || ""; // 自動登入儲存的帳號 let $status = $("#GOOGLE_status"); function init() { $.getScript("https://accounts.google.com/gsi/client", function () { // 進行登入程序 startLogin(); }); } // 進行登入程序 function startLogin() { google.accounts.id.initialize({ client_id: "5432xxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com", callback: onLogin, prompt_parent_id: "GOOGLE_login", // 設定登入視窗的位置, 若不設定此參數則預設出現在網頁右上角 auto_select: true, // 自動登入 login_hint: autoLoginGoogleAccount // 自動登入儲存的帳號 }); google.accounts.id.prompt((notification) => { // 處理登入失敗 loginFail(notification); }); } // 處理登入取得的資訊 function onLogin(response) { var credential = response.credential, profile = JSON.parse(decodeURIComponent(encodeURIComponent(window.atob(credential.split(".")[1].replace(/-/g, "+").replace(/_/g, "/"))))), html = ""; // 儲存登入帳號 localStorage.autoLoginGoogleAccount = profile.email; html += "ID: " + profile.sub + "<br/>"; html += "會員暱稱: " + profile.name + "<br/>"; html += "會員頭像:" + profile.picture + "<br/>"; html += "會員 email:" + profile.email + "<br/>"; $status.html(html); } // 處理登入失敗 function loginFail(notification) { /*notification.g 數值 → display: 登入中, skipped: 取消登入, dismissed: 登入成功*/ if (notification.g == "skipped") { // 取消登入時 $status.html("取消登入 Google 帳號,請稍後再試"); } if (notification.g == "display" && notification.h == false) { // 無痕模式無法登入 $status.html("無法登入 Google 帳號,請離開無痕模式或使用 Chrome 瀏覽器登入。"); } } // 進行登出 function logout() { // 刪除自動登入儲存的帳號 localStorage.autoLoginGoogleAccount = ""; // 登出 google.accounts.id.disableAutoSelect(); $status.html("已登出"); } init(); // 點擊登入 $("#GOOGLE_login").click(function() { // 進行登入程序 startLogin(); }); // 點擊登出 $("#GOOGLE_logout").click(function() { // 進行登出 logout(); }); </script>
  • 紅色字串請置換為前面「處理 OAuth 憑證」流程取得的「用戶端 ID」
  • 程式碼請放在前面「處理 OAuth 憑證」流程設定的網站
3. 範例效果下面按鈕為範例效果,可進行操作並注意對應狀態的文字。 首次登入完畢後,重整頁面即可看到自動登入的效果。
目前狀態:
更多 Google 相關文章:

Viewing all articles
Browse latest Browse all 784

Trending Articles