使用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作为参数。 所以我一直在搜索Microsoft URL,以便能够在同一个URL中发送clientId,scope和redirectURI。 这是迄今为止的结果:

 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图形API调用?

如果你知道任何更好的解决方案或任何建议我会很高兴收到它们! 这是我的第一个使用login的项目,因为我对Swift很新。

更新:

我还可以提到Microsoft文档建议使用这些库:

  • Microsoft身份validation库(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端点与许多第三方身份validation库兼容。

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

我已经尝试了MSAL和AppAuth,但他们只是没有给我任何回复。

@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确实存在问题