ios - 使用 SFAuthenticationSession 将用户登录到 Microsoft Graph

标签 ios swift office365 microsoft-graph-api

我一直在使用 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 的访问 token 。但是我应该从这里去哪里呢?如何获取刷新 token ,以便开始调用 Microsoft 图形 API 调用?

如果您知道任何更好的解决方案或任何建议,我将很高兴收到它们!这是我使用登录的第一个项目,因为我对 Swift 还很陌生。

更新:

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

  • Microsoft 身份验证库 (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,但他们没有给我任何回复。

最佳答案

@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
}

关于ios - 使用 SFAuthenticationSession 将用户登录到 Microsoft Graph,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49773318/

相关文章:

ios - 我如何命名和控制 iOS 游戏中的个别 child ?

ios - 粘贴长文本时 UITextView 动态高度滚动不起作用

android - 如果为 2D 游戏制作的图形集看起来如何?

ios - Swift:编辑模式,将 editButtonItem() 链接到 IBAction

sharepoint - 如何通过 API 查找 OneDrive 是否对 Office365 中的用户有效?

ios - 为什么增加 CCKeyDerivationPBKDF 的轮数会提高安全性?

ios - 表格 View 中的搜索栏

swift - 来自警报操作的更新程序 NSUserDefaults

c# - 无需用户交互即可获取 Office 365 API 访问 token

azure - 获取 SAML 断言的 office365/azure 用户的 immutableid