Использование sfauthenticationsession для входа пользователя в microsoft graph

Раньше я использовал библиотеку p2-oauth2, чтобы иметь возможность войти в систему через safariViewController, но, начиная с последней версии iOS (11.3), я обнаружил, что мое приложение все время дает сбой, когда пользователь пытается войти в систему. Я не получать какие-либо сообщения об ошибках, но через некоторое время я обнаружил, что SFAuthenticationSessions - это лучший способ использовать SSO (единый вход).

Мой старый код был примерно таким (с использованием p2_oauth2):

static var oauth2 = OAuth2CodeGrant(settings: [
    "client_id": "myClientID",
    "authorize_uri": "https://login.microsoftonline.com/common/oauth2/v2.0/authorize",
    "token_uri": "https://login.microsoftonline.com/common/oauth2/v2.0/token",
    "scope": "User.Read Mail.Read Calendars.ReadWrite Calendars.Read Calendars.Read.Shared Offline_access",
    "redirect_uris": ["myRedirectURI"],
    "keychain": true
    ])

func loginToOffice365(completion: @escaping (_ error: Error? ) -> ()) {
    var userDataRequest: URLRequest {
        var request = URLRequest(url: URL(string: "https://graph.microsoft.com/v1.0/me/")!)
        request.setValue("Bearer \(OauthManager.oauth2.accessToken ?? "")", forHTTPHeaderField: "Authorization")
        return request
    }

    alamofireManager.request(userDataRequest).validate().responseJSON { 
 (response) in
    switch response.result {
    case .success( _):
    //Handle user information
        completion(nil)
    case .failure(let error):
        completion(error)
            }
        }
}

Я пытался реализовать в SFAuthenticationSession в своем проекте, и для этого требовался URL-адрес в качестве параметра. Итак, я какое-то время искал URL-адрес Microsoft, чтобы можно было отправлять clientId, scope и redirectURI по одному и тому же URL-адресу. И вот результат:

let url = URL(string: "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?state=78E99F6B&response_type=code&scope=User.Read+Mail.Read+Calendars.ReadWrite+Calendars.Read+Calendars.Read.Shared&redirect_uri=MYREDIRECTURI&client_id=MYCLIENTID")!
        OauthManager.authenticationSession = SFAuthenticationSession(url: url, callbackURLScheme: nil, completionHandler: { (successUrl: URL?, error: Error?) in
            if let error = error {
                print(error)
                completion(error)
            } else {
                var accessToken = ""
                if let absolutString = successUrl?.absoluteString, let urlComponents = URLComponents(string: absolutString)?.query {
                    accessToken = urlComponents
                }
                print(accessToken)
                completion(nil)
            }
        })
        OauthManager.authenticationSession?.start()

Итак, теперь я наконец получил токен доступа от Microsoft. Но что мне делать дальше? Как получить токены обновления, чтобы можно было запускать вызовы Microsoft Graph API?

Если вы знаете какое-либо лучшее решение или какой-либо совет, я буду рад их получить! Это мой первый проект с использованием входа в систему, потому что я новичок в Swift.

Обновлять:

Я также могу упомянуть, что документация Microsoft рекомендует использовать следующие библиотеки:

  • Клиентские библиотеки Microsoft Authentication Library (MSAL) доступно для .NET, JavaScript, Android и Objective-C. Все платформы находятся в предварительной версии, поддерживаемой производством, и, в случае вводятся критические изменения, Microsoft гарантирует путь к Обновить.
  • Серверное промежуточное ПО от Microsoft доступно для .NET Core и ASP.NET (OWIN OpenID Connect и OAuth) и для Node.js (Microsoft Azure AD Passport.js).
  • Конечная точка v2.0 совместима со многими сторонними аутентификациями. библиотеки.

https://developer.microsoft.com/en-us/graph/docs/concepts/auth_overview

Я пробовал MSAL и AppAuth, но они мне не ответили.

Какой метод у вашего делегата приложения есть для обработки обратного вызова? См. stackoverflow.com/questions/39069361/…

Paulw11 11.04.2018 14:37

Вы, сэр, спасли меня! Я использовал подобную функцию в appDelegate, но я попробовал вашу и вуаля! просто отлично работает! Большое спасибо!

Jacob Ahlberg 11.04.2018 15:03

Без проблем. Меня это тоже укусило. Это сложно отлаживать, потому что исключение и трассировка стека не особенно полезны.

Paulw11 11.04.2018 15:04

Вам необходимо запросить прицел offline_access, чтобы получить refresh_token. Вы можете взглянуть на Massivescale.com/microsoft-v2-endpoint-primer

Marc LaFleur 11.04.2018 15:21

Я вернулся к библиотеке p2-oauth2 и попробовал ответить Paulw11, и он внезапно снова начал работать отлично. В приведенном выше коде я использовал p2_oauth2 и offline_access в области видимости, чтобы получить токен обновления. Но все равно спасибо! @Marc LaFleur

Jacob Ahlberg 11.04.2018 15:30
0
5
764
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

@ Paulw11 нашел ответ.

Я использовал метод, который отлично работал до XCode 9.3 и iOS 11.3:

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return true
}

Но мне пришлось перейти на следующий метод, чтобы он заработал:

func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return true
}

Это исправлено в Xcode 9.4 и работает нормально, пока мы его тестировали. В Xcode 9.3 действительно есть проблема

Другие вопросы по теме