Câu hỏi SFSafariViewController Xóa cookie OAuth2


Tôi có ứng dụng iOS xác thực với Uber API bằng OAuth2 trong UIWebView. Khi nâng cấp lên iOS 9, tôi chạy vào vấn đề ATS chặn yêu cầu https cho trang đăng nhập. Sau đó tôi thêm một ngoại lệ cho trang đăng nhập Uber, nhưng sau đó nhận thấy trang đăng nhập đưa ra một số yêu cầu khác lên Facebook, Amazon Web Services và các trang web khác, tất cả đều bị chặn bởi ATS.

Tôi không muốn phải duy trì danh sách ngoại lệ cho trang đăng nhập Uber, vì Uber có thể dễ dàng thay đổi trang của họ và ứng dụng của tôi sẽ không có ngoại lệ chính xác. Vì vậy, tôi quyết định cho SFSafariViewController một shot.

Tôi có thể hoàn tất quy trình OAuth2 bằng SFSafariViewController, vấn đề là có một số loại cookie được lưu trữ từ Uber khi xác thực hoàn tất. Nếu tôi muốn xác thực một tài khoản khác và tôi đưa ra SFSafariViewController một lần nữa, cookie được chọn từ xác thực trước đó và không có cơ hội xác thực tài khoản khác. Tôi đã nhận được điều này với UIWebView bằng cách xóa cookie thông qua NSHTTPCookieStorage, nhưng tôi không thấy cách xóa cookie từ SFSafariViewController.


14
2017-09-22 16:31


gốc


Bạn đã quản lý để giải quyết điều này? Tôi đang gặp vấn đề tương tự. - goldengil
Tôi không tìm thấy giải pháp để xóa cookie. Về cơ bản tôi đã thay đổi ứng dụng của mình để thu hồi mã thông báo OAuth khi đăng xuất để cookie OAuth được lưu trữ không còn hợp lệ nữa. - duncanc4


Các câu trả lời:


Đối với iOS 9 trở đi, lựa chọn tốt nhất là sử dụng WKWebView lớp có sẵn trong Khung WebKit

cung cấp một WKWebsiteDataStore có thể được sử dụng để xóa cookie / cache được sử dụng bởi webview, xem ví dụ: https://stackoverflow.com/a/31803708/313113 hoặc là https://stackoverflow.com/a/32491271/313113

Theo tài liệu: SFSafariViewController chia sẻ cookie và dữ liệu trang web khác với Safari và vì nó chạy bên ngoài quy trình của ứng dụng của bạn (vì lý do bảo mật) bạn không thể sửa đổi trạng thái của nó từ bên trong ứng dụng của bạn. Xem câu trả lời này: https://stackoverflow.com/a/34136074/313113 từ một người đã liên hệ với bộ phận hỗ trợ khách hàng của Apple và nhận được câu trả lời sau:

SFSafariViewController chạy bên ngoài quy trình của ứng dụng của tôi và theo thứ tự   để được an toàn App của tôi không thể sửa đổi trạng thái của SFSafariViewController. Trong   các từ khác, Ứng dụng của tôi không thể xóa thông tin xác thực được lưu trữ bởi   SFSafariViewController.


2
2018-02-29 20:50



WKWebView sẽ không hoạt động vì sau đó tôi sẽ cần chỉ định tên miền cho mỗi yêu cầu HTTP được tạo bởi trang đăng nhập Uber. Do trang không được tôi duy trì và rất có thể sẽ thay đổi, việc sử dụng ngoại lệ ATS sẽ dễ dàng bị hỏng. Đây là lý do tại sao tôi phải chuyển sang SFSafariViewController. - duncanc4
Bạn đã tìm thấy giải pháp cho điều này? @ duncanc4 - Zaid Pathan
Tôi muốn sử dụng SFAuthenticationSession nhưng không thể xóa cookie, vì vậy tôi đã sử dụng WKWebView và xử lý nội dung bằng chính bản thân mình ... - fl034


Vì vậy, tôi đã gặp phải sự cố tương tự này và đã xem câu hỏi của bạn khi tìm kiếm cách giải quyết vấn đề này. Trong trường hợp của tôi, giải pháp tốt nhất mà tôi đưa ra là làm công cụ đăng xuất trong ứng dụng và sau đó trình bày một SFSafariViewController chỉ vào url đăng xuất của chúng tôi. Sau đó tôi sử dụng nó để đóng SFSafariViewController ngay sau khi nó được tải xong:

extension AlertsTableViewController: SFSafariViewControllerDelegate {

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

}

Tôi đã lưu trữ SFSafariViewController trong logoutSVC vì vậy tôi chỉ chạy mã này nếu đây là SFSafariViewController đăng xuất. Trong trường hợp của bạn, có vẻ như bạn vừa thực hiện cuộc gọi API để thu hồi mã thông báo OAuth đẹp hơn một chút vì nó không hiển thị cho người dùng chút nào nhưng điều này rất tốt cho các trường hợp bạn không có quyền truy cập như vậy. Một điều nữa, vì một lý do nào đó tôi phải gọi phương thức remove (animated: false) trên SFSafariViewController thay vì UIViewController hiện tại thực tế vì một lý do nào đó. Đã cho tôi một giây để tìm ra lý do tại sao nó không làm việc cho tôi.


0
2017-10-20 19:52