導入 OAuth 2.0 後,您可以視需要設定以 OAuth 為基礎的App Flip,讓 iOS 使用者能更快速地將驗證系統中的帳戶連結至 Google 帳戶。以下各節說明如何在 iOS 上設計及實作 Cloud-to-cloud 整合的 App Flip。
設計指南
本節說明應用程式切換帳戶連結同意畫面的設計規定和建議。Google 呼叫應用程式後,應用程式會向使用者顯示同意畫面。
需求條件
- 您必須提供 Google 授權聲明,例如「連結後,Google 將有權控制您的裝置。」
- 您必須告知使用者,他們的帳戶將連結至 Google,而非 Google Home 或 Google 助理等特定 Google 產品。
- 您必須在同意畫面中加入明確的行動號召,並使用「同意並連結」字樣來表示連結動作。這是因為使用者必須瞭解連結帳戶時,需要與 Google 分享哪些資料。
- 如果使用者選擇不連結,您必須提供返回、拒絕或取消的方法。取消動作請使用「取消」一詞。
- 您必須實作這項工作流程:使用者點選「同意並連結」後,您必須顯示連結成功訊息,並自動將使用者重新導向至 Google Home 應用程式。使用者現在應該會在 Google Home 應用程式中看到連結的裝置。按一下「取消」後,請將使用者重新導向回 Google Home 應用程式。
建議
建議您採取下列做法:
顯示《Google 隱私權政策》。在同意畫面中加入《Google 隱私權政策》連結。
要分享的資料。請使用簡潔明瞭的用語,告知使用者 Google 需要哪些資料,以及原因。
可取消連結。提供使用者取消連結的機制,例如平台帳戶設定的網址。或者,您也可以加入 Google 帳戶的連結,讓使用者管理已連結的帳戶。
可變更使用者帳戶。建議使用者切換帳戶的方法。如果使用者通常有多個帳戶,這項功能就特別實用。
- 如果使用者必須關閉同意畫面才能切換帳戶,請將可復原的錯誤傳送給 Google,讓使用者透過 OAuth 連結和隱含流程登入所需帳戶。
加入您的標誌。在同意畫面上顯示公司標誌。 請按照樣式指南放置標誌。如要顯示 Google 標誌,請參閱「標誌和商標」一文。
設定以 OAuth 為基礎的App Flip
以下各節說明以 OAuth 為基礎的應用程式快速連結功能必要條件,以及如何在 Google Home Developer Console 中設定應用程式快速連結專案。
建立雲端對雲端整合,並設定 OAuth 2.0 伺服器
設定 App Flip 之前,您必須先完成下列事項:
- 設定 OAuth 2.0 伺服器。如要進一步瞭解如何設定 OAuth 伺服器,請參閱「導入 OAuth 2.0 伺服器」。
- 建立雲端對雲端整合。如要建立整合,請按照「建立雲端對雲端整合」一文的操作說明進行。
在開發人員控制台中設定應用程式快速連結
下一節將說明如何在開發人員控制台中設定應用程式快速連結。
- 填寫「OAuth Client information」(OAuth 用戶端資訊) 下方的所有欄位。 (如果不支援 App Flip,則會改用一般 OAuth)。
- 在「Use your app for account linking(optional)」下方,勾選「Enable for iOS」。
- 填寫「通用連結」欄位。如要進一步瞭解通用連結,請參閱「允許應用程式和網站連結至您的內容」。
- 如要設定用戶端 (選用),請在「Configure your client (optional)」(設定用戶端 (選用)) 下方新增範圍,然後按一下「Add scope」(新增範圍)。
- 按一下 [儲存]。
現在可以繼續進行下一節,在 iOS 應用程式中導入 App Flip。
在原生應用程式中導入 App Flip
如要導入 App Flip,您必須修改應用程式中的使用者授權碼,才能接受 Google 的深層連結。
採用 OAuth 的應用程式快速連結 (App Flip) 功能會從 Google 應用程式開啟 iOS 應用程式,協助 Google 應用程式使用者更輕鬆地連結帳戶。您需要對 iOS 應用程式進行小幅程式碼變更,才能導入這項功能。
本文將說明如何修改 iOS 應用程式,以支援應用程式快速連結。
試用範例
應用程式快速連結 範例應用程式示範了 iOS 上的帳戶連結整合,與應用程式快速連結相容。您可以使用這個應用程式,驗證如何回應 Google 行動應用程式傳入的應用程式快速連結通用連結。
範例應用程式已預先設定為與 iOS 版應用程式快速連結測試工具整合,您可以使用該工具驗證 iOS 應用程式與應用程式快速連結的整合,然後再設定與 Google 的帳戶連結。這個應用程式會模擬啟用應用程式快速連結時,Google 行動應用程式觸發的通用連結。
運作方式
以下是 Google 應用程式和您的應用程式在應用程式快速連結時採取的流程步驟:
Google 應用程式會嘗試開啟應用程式的通用連結。如果使用者的裝置上已安裝應用程式,且與通用連結相關聯,則可開啟應用程式。詳情請參閱「支援通用連結」。
應用程式會檢查傳入網址中編碼的
client_id和redirect_uri參數,是否與預期的 Google 通用連結相符。應用程式向 OAuth2 伺服器要求授權碼。流程結束時,應用程式會將授權碼或錯誤傳回 Google 應用程式。為此,應用程式會開啟 Google 的通用連結,並附加授權碼或錯誤的參數。
Google 應用程式會處理傳入的 Google 通用連結,並繼續執行其餘流程。如果提供授權碼,連結會立即完成。權杖交換會在伺服器之間進行,與瀏覽器型 OAuth 連結流程相同。如果傳回錯誤代碼,連結流程會繼續進行替代選項。
修改 iOS 應用程式以支援應用程式快速連結
如要支援應用程式快速連結,請對 iOS 應用程式進行下列程式碼變更:
- 在應用程式委派中處理
NSUserActivityTypeBrowsingWeb。 - 從網址擷取
redirect_uri和state參數,供後續使用。 - 確認
redirect_uri符合以下格式:https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
確認用戶端 ID 與預期值相符。請使用下列程式碼範例:
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let incomingURL = userActivity.webpageURL, let components = URLComponents(url: incomingURL, resolvingAgainstBaseURL: false), let params = components.queryItems else { return false } if let clientId = params.filter({$0.name == "client_id"}).first?.value, let state = params.filter({$0.name == "state"}).first?.value, let redirectUri = params.filter({$0.name == "redirect_uri"}).first?.value { // Save the redirect_uri and state for later... // Verify the client id return (clientId == GOOGLE_CLIENT_ID) } else { // Missing required parameters return false } }授權成功後,請使用授權碼呼叫重新導向 URI。請使用下列程式碼範例:
func returnAuthCode(code: String, state: String, redirectUri: String) { var redirectURL = URL(string: redirectUri) var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false) // Return the authorization code and original state let paramAuthCode = URLQueryItem(name: "code", value: code) let paramState = URLQueryItem(name: "state", value: state) components?.queryItems = [paramAuthCode, paramState] if let resultURL = components?.url { UIApplication.shared.open( resultURL, options: [UIApplicationOpenURLOptionUniversalLinksOnly : true], completionHandler: nil) } }如果發生錯誤,請改為將錯誤結果附加至重新導向 URI。請使用下列程式碼範例:
func returnError(redirectUri: String) { var redirectURL = URL(string: redirectUri) var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false) // Return the authorization code and original state let paramError = URLQueryItem(name: "error", value: "invalid_request") let paramDescription = URLQueryItem(name: "error_description", value: "Invalid Request") components?.queryItems = [paramError, paramDescription] if let resultURL = components?.url { UIApplication.shared.open( resultURL, options: [UIApplicationOpenURLOptionUniversalLinksOnly : true], completionHandler: nil) } }
應用程式通用連結的查詢參數
由 Google 應用程式開啟時,應用程式的通用連結會包含下列查詢參數:
client_id(String):在應用程式中註冊的 Googleclient_id。scope(List of String):以空格分隔的要求範圍清單。state(String):Google 用來驗證授權結果是否為 Google 傳出要求的回應。redirect_uri(String):Google 的通用連結。用於開啟 Google 應用程式並傳遞結果的「flip」URI。
Google 通用連結的查詢參數
成功傳回授權結果時使用的參數:
code(String):授權碼的值 (如有)。state(String):從傳入通用連結收到的確切值。
授權結果傳回失敗時使用的參數:
error(String),包含下列值:cancelled:可復原的錯誤。Google 應用程式會嘗試使用授權網址連結帳戶。例如使用者無法登入、裝置離線或連線逾時。unrecoverable:無法復原的錯誤。例如,使用者嘗試連結已停用的帳戶。Google 應用程式會取消帳戶連結。invalid_request:要求參數無效或遺漏。這是可復原的錯誤。Google 應用程式會嘗試使用授權網址連結帳戶。access_denied:使用者拒絕同意聲明要求。這是無法復原的錯誤,Google 應用程式會中止連結。
error_description(String,選用):簡單易懂的錯誤訊息。
無論是哪種錯誤類型,都必須將回應資料傳回指定的 REDIRECT_URI,確保系統觸發適當的備用廣告。
修改授權端點,支援應用程式快速連結
將平台設為接受使用 Google 應用程式快速連結重新導向網址的要求:
- Google Home 應用程式
https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.dev https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.enterprise https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.dev https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.enterprise https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast
- Google 助理應用程式
https://oauth-redirect.googleusercontent.com/a/com.google.OPA.dev https://oauth-redirect.googleusercontent.com/a/com.google.OPA.enterprise https://oauth-redirect.googleusercontent.com/a/com.google.OPA https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.dev https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.enterprise https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA
如果是Google Home app (GHA),智慧住宅帳戶連結會使用com.google.Chromecast重新導向網址。請確認授權伺服器允許這些重新導向網址。
收到要求時,請確認 client_id 和 redirect_uri 參數指定的網址與預期值相符。如果用戶端驗證失敗,請將錯誤 invalid_request 傳回 redirect_uri。
在裝置上測試「App Flip」
您已建立雲端對雲端整合,並在控制台和應用程式中設定應用程式快速連結,現在可以在行動裝置上測試應用程式快速連結。您可以使用 Google Home 應用程式測試應用程式快速連結。
如要從 Google Home 應用程式測試 App Flip,請按照下列步驟操作:
- 前往 Developer Console 並選取專案。
- 依序前往「Cloud-to-cloud」>「測試」。
- 從 Google Home 應用程式觸發帳戶連結流程:
- 開啟 Google Home app (GHA)。
- 按一下「+」按鈕。
- 按一下「設定裝置」。
- 按一下「是否有已經設定好的裝置?」
- 從供應商清單中選取雲端對雲端整合。清單中的名稱會加上「[測試]」前置字元。從清單中選取 [測試] 整合項目後,系統應會開啟應用程式。
- 確認應用程式已啟動,並開始測試授權流程。