web-dev-qa-db-ja.com

SFSafariViewControllerOAuth2Cookieを削除します

UIWebViewでOAuth2を使用してUberAPIで認証するiOSアプリケーションがあります。 iOS 9にアップグレードすると、ログインページのhttpsリクエストをブロックするATSの問題が発生します。次に、Uberログインページの例外を追加しましたが、ログインページがFacebook、Amazon Web Services、およびその他のWebサイトに対して他のいくつかの要求を行い、すべてATSによってブロックされていることに気付きました。

Uberはページを簡単に変更でき、アプリには正しい例外がないため、Uberログインページの例外のリストを維持する必要はありません。そこで、SFSafariViewControllerを試してみることにしました。

SFSafariViewControllerを使用してOAuth2プロセスを完了することができます。問題は、認証の完了時にUberから何らかの種類のCookieが保存されていることです。別のアカウントを認証したいときにSFSafariViewControllerを再度起動すると、Cookieは以前の認証から取得され、別のアカウントを認証する機会がありません。 UIWebViewを介してCookieを削除することでNSHTTPCookieStorageでこれを回避しましたが、SFSafariViewControllerからCookieを削除する方法がわかりません。

22
duncanc4

IOS 9以降の場合、最良の選択は WebKit Framework で利用可能な WKWebView クラスを使用することです。

これは、Webビューで使用されるCookie /キャッシュを削除するために使用できる WKWebsiteDataStore を提供します。例を参照してください: https://stackoverflow.com/a/31803708/31311 または https://stackoverflow.com/a/32491271/31311

ドキュメントによると: SFSafariViewController Cookieやその他のウェブサイトデータをSafariと共有し、アプリのプロセス外で実行されるため(セキュリティ上の理由から)、できませんアプリ内から状態を変更します。この回答を参照してください: https://stackoverflow.com/a/34136074/31311 カスタマーサポートに連絡して次の返信を受け取った人から:Apple

SFSafariViewControllerはアプリのプロセス外で実行され、安全を確保するために、アプリはSFSafariViewControllerの状態を変更できません。つまり、私のアプリはSFSafariViewControllerによって保存された資格情報をクリアできません。

4
bitek

だから私はこれと同じ問題に遭遇し、これを解決する方法を探しているときにあなたの質問を見ました。私の場合、私が思いついた最善の解決策は、アプリでログアウト処理を実行してから、ログアウトURLを指すSFSafariViewControllerを提示することでした。次に、これを使用して、ロードが完了したらすぐにSFSafariViewControllerを閉じました。

extension AlertsTableViewController: SFSafariViewControllerDelegate {

    public func safariViewController(_ controller: SFSafariViewController, didCompleteInitialLoad didLoadSuccessfully: Bool) {
        if controller == logoutSVC {
            controller.dismiss(animated: false)
        }
    }

}

SFSafariViewControllerをlogoutSVCに保存したので、これがログアウトSFSafariViewControllerである場合にのみこのコードを実行します。あなたの場合、API呼び出しを行ってOAuthトークンを取り消すように聞こえますが、ユーザーにはまったく表示されないため、少し便利ですが、これは次のような場合に適しています。そのようなアクセス権がありません。もう1つ、何らかの理由で、実際の現在のUIViewControllerではなくSFSafariViewControllerのdismiss(animated:false)メソッドを呼び出す必要がありました。なぜそうではなかったのかを理解するのに少し時間がかかりました。私のために働いています。

2
Brian F Leighty