![](/img/trans.png)
[英]Using SFSafariViewController instead of ASWebAuthenticationSession/SFAuthenticationSession for OAuth
[英]SFAuthenticationSession/ASWebAuthenticationSession and logging out
我打算將一個應用程序從舊的 OAuth 流與SFSafariViewController
到新流與 iOS 11 的SFAuthenticationSession
。 登錄不是問題,轉移到新的 API 花了我幾分鍾時間來實施。 但是注銷讓我感到困惑。
如何?
我在文檔中找不到任何提及要提供注銷選項的內容。 使用舊的SFSafariViewController
使 cookies 無效? 不,它們不再與SFAuthenticationSession
共享。 一旦我重新啟動身份驗證 session,用戶就會自動登錄,而且沒有出路。 那么如何啟用注銷呢? 或者我只是忽略了一些非常明顯的事情?
更新:我發現了一種技術意義上的“有效方式”,但它對用戶來說太瘋狂了:在清除 cookie 的注銷頁面上打開一個新的 SFAuthenticationSession。 但這意味着當注銷時,警報視圖會再次詢問用戶是否願意通過該服務登錄。 如果選擇是(“登錄”),則打開 cookie 清除注銷頁面,用戶必須手動關閉視圖,這可以被完成處理程序捕獲,我們知道我們可以再次打開登錄視圖..顯示登錄提示注銷? 我真的不喜歡這個解決方案。
有任何想法嗎? 我是否仍然忽略了一個完全明顯的解決方案?
更新 2:由於到目前為止還沒有人對這個問題有任何線索,這可能不是一件容易的事。 我已通過他們的報告工具向 Apple 提出建議,以闡明如何處理此問題或將其構建到 API(如果不可用)。 如果我得到答案,將發布。
更新 3:在進一步思考這個問題之后,我們找到了另一個可能的(雖然也沒有吸引力)解決方案,如果您可以影響 OAuth 提供商的登錄頁面:使 cookies 非常短暫。 然后可以在不自動登錄的情況下打開登錄頁面。但是,這會破壞在應用程序之間共享登錄會話的全部目的……並且您需要能夠影響登錄頁面。
更新 4:自 iOS 12 SFAuthenticationSession
被棄用並被ASWebAuthenticationSession
取代。 但是ASWebAuthenticationSession
不會更改有關注銷的任何內容。 還是不行。 和以前一樣的問題。
2020 年 11 月更新:我們使用 @react-native-community/cookies 清除 cookie 作為解決方法。 請參閱下面的剪輯作為示例。
import CookieManager from '@react-native-community/cookies';
CookieManager.clearAll().catch(e => alert("Error deleting cookies during logout"))
2020 年 4 月的先前回答。 這可能對任何為此苦苦掙扎的人有所幫助。 我花了幾個小時測試不同的選項,瀏覽應用程序並查看它們是如何做到的,並閱讀論壇/討論。
ASWebAuthenticationSession
或SFAuthenticationSession
登錄過,則下載的任何應用程序都不會要求登錄 FB。ASWebAuthenticationSession
(如前所述,這是非常奇怪的 UX)。 B) 將 Safari 作為單獨的應用程序打開(不在您的應用程序中)並在那里登錄/注銷。 不幸的是,如果 OAuth 提供程序不支持注銷時重定向,則無法在注銷后將用戶重定向到您的應用程序。這很糟糕,因為這會阻止開發人員在 iOS 上為企業需要在多個用戶之間共享設備並且使用 OAuth 作為身份提供者的用例創建良好的體驗。
使用 ASWebAuthenticationSession,在調用 .start() 之前將 .prefersEphemeralWebBrowserSession 設置為 true 將強制用戶在瀏覽器會話中輸入憑據。 雖然與注銷不同,但這將允許新用戶在啟動下一個會話時使用不同的憑據登錄。
我遇到的“最佳”解決方案之一是在系統 Safari(不是SFSafariViewController
)中打開一個注銷頁面。 因為ASWebAuthenticationSession
與 Safari 可靠地共享 cookie,所以過期/刪除的 cookie 也會影響應用程序。
有關更多詳細信息,請參閱此 GitHub 頁面。
這取決於哪個 cookie 存儲您的登錄信息;
如果它是會話 cookie,則不會按照https://developer.apple.com/documentation/authenticationservices/aswebauthenticationsession與 Safari 共享
因此,只需清除您的本地會話,cookie 將在下一次應用程序啟動時清除。
如果沒有,並且 cookie 仍然存在,那么就像上面 Martin 所說的那樣,您應該使用您的注銷 URL 打開 Safari(而不是SFSafariViewController
),然后重定向回您的應用程序。
如果您需要更多信息,請告訴我。 我已經對所有 3 種身份驗證方式( ASWebAuthenticationSession
、 Safari 和SFSafariViewController
)進行了廣泛的測試。
對於 iOS 13.0 需要為 UISceneConfiguration 添加 SceneDelegate.swift
還需要更新 UIScene 實現的 appdelegate
添加 UISceneSession 生命周期
通過這種方式解決了 SFAuthenticationSession 問題,它工作正常。
在我們的一個應用程序中,我們已經開始使用ASWebAuthenticationSession 。
我們的用例不僅僅是在登錄時檢索訪問和刷新令牌。 我的意思是,在打開 web 應用程序(同時登錄到 iOS 應用程序)時使用相同的 session cookie,以避免用戶一次又一次地重新驗證自己。 最終,當用戶最終決定注銷他們的帳戶並且此后可能嘗試使用不同的帳戶再次重新登錄時,時間到了。 由於屆時用戶的 session cookie 可能仍然存在,因此任何重新登錄嘗試只會暫時閃爍身份驗證屏幕,自動將他們登錄回他們的第一個帳戶,而不會讓他們有機會輸入第二個帳戶的憑據。
為了在每次我們呈現身份驗證屏幕時真正強制用戶輸入他們的憑據,我們必須將prompt=login
對添加到我們的 Auth0 查詢參數中。
這是 URL 的樣子:
https://example.auth0.com/authorize?
client_id=abcd1234
&redirect_uri= https://example.com/callback
&scope=openid profile
&response_type=id_token
&prompt=login
您可以在此 Auth0 文檔上找到有關此的更多信息: https://auth0.com/docs/authenticate/login/max-age-reauthentication
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.