Как SFAuthenticationSession хранит связанные с сеансом куки в Safari - PullRequest
0 голосов
/ 07 декабря 2018

tl; dr прочитайте последний абзац.

Я использую библиотеку AppAuth (https://github.com/openid/AppAuth-iOS)) для обработки аутентификации пользователей на основе OpenID, для которых я хочу предоставить SSO через свое приложение. Развертываниецелью моего приложения является iOS 11, что означает, что AppAuth внутренне использует SFAuthenticationSession. Я использую поток авторизации, который означает, что пользователю предоставляется веб-страница входа через SFAuthenticationSession. Когда пользователь заполняет и отправляет учетные данные SFAuthenticationSession вызывает завершение с помощью URL (в случае успеха), с которого можно проанализировать авторизацию * 1008. * При авторизации code запрос POST токена через URLSession выполняется независимо от SFAuthenticationSession и извлекается access_token.

Весь поток успешен, включая получение access_token, но когда я покидаю приложение и открываю веб-страницу профиля пользователя, предоставленную поставщиком услуг в Safari, пользователь не вошел в систему. Я протестировал тот же поток сУчетная запись Google (https://accounts.google.com) и SSO работали нормально, например, когда я открыл https://mail.google.com в Safari, у меня был логтак что у меня есть подозрение, что мой поставщик услуг делает что-то не так.Возможно, они не предоставили мне правильные возможности?Но прежде чем связаться с ними, я хочу исключить любую мою ошибку.Теперь моя самая непосредственная мысль заключается в том, что файлы cookie, связанные с сеансом, не сохраняются в Safari.Отсюда вытекает мой вопрос.

Мой вопрос.Запрос токена POST выполняется независимо от SFAuthenticationSession (другой пользовательский агент), так как любые файлы cookie, связанные с сеансом, сохраняются на устройстве (Safari), если не через SFAuthenticationSession?И есть ли способ отладки файлов cookie в коде?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

В соответствии со стандартом OAuth 2.0, конечная точка токена *1001* не требует аутентификации владельца ресурса, в отличие от конечной точки авторизации , которая это делает.(Сценарий или обратный канал, выполняющий обмен кодами авторизации, не обязательно имеет доступ к HTTP-cookie, установленным в пользовательском агенте, и по умолчанию браузеры не включают учетные данные в межсайтовые XHR. Когда используется токен обновления, владелец ресурсавзаимодействие вообще не требуется.) Ваша URLSession не получает сессионный cookie от Safari или SFAuthenticationSession и не нуждается в нем.

Что касается вашего мобильного Safari, документы для ASWebAuthenticationSession , преемник SFAuthenticationSession, состояние:

Все файлы cookie, кроме файлов cookie сеанса, могут использоваться совместно с Safari.

Похоже, это относится и к SFAuthenticationSession.Google должен использовать постоянные файлы cookie, и в результате с ними работает общий доступ к сеансам.

Кстати, даже при наличии постоянных файлов cookie наблюдается некоторая несогласованность при синхронизации, например, файлов cookie в среде iOS 11.: http://www.openradar.me/radar?id=5036182937272320

0 голосов
/ 07 декабря 2018

Для отладки файлов cookie вы можете использовать этот код:

import UIKit

import WebKit

class ViewController: UIViewController, WKNavigationDelegate {

var webView: WKWebView?

override func viewDidLoad() {
    super.viewDidLoad()

    let configuration = WKWebViewConfiguration()
    webView = WKWebView(frame: .zero,configuration:configuration)
    self.view = webView
}

override func viewDidAppear(_ animated: Bool) {
    let url = URL(string: "YOUR URL")

    let request = URLRequest(url: url!)

    webView?.navigationDelegate = self
    webView?.addObserver(self, forKeyPath: "URL", options: [.new, .old], context: nil)

    self.webView?.load(request)
}

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

    if let newValue = change?[.newKey] as? Int, let oldValue = change?[.oldKey] as? Int, newValue != oldValue {

        print("NEW",change?[.newKey])
    } else {
        print("OLD",change?[.oldKey])

    }

    webView?.configuration.websiteDataStore.httpCookieStore.getAllCookies { cookies in
        for cookie in cookies {
            print(cookie)
        }
    }
}
}

и проверить, есть ли у файлов cookie свойство expiresDate.Если нет, вы не сможете использовать SSO.

...