首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SFAuthenticationSession登录用户到Microsoft

使用SFAuthenticationSession登录用户到Microsoft
EN

Stack Overflow用户
提问于 2018-04-11 10:59:27
回答 2查看 859关注 0票数 0

我之前一直使用p2-oauth2库来通过safariViewController登录,但是自从最新的iOS版本(11.3)之后,我发现我的应用程序在用户尝试登录时一直在崩溃。我没有收到任何错误消息,但是过了一段时间,我发现SFAuthenticationSessions是使用SSO (单点登录)的方法。

我的旧代码非常类似(使用p2_oauth2):

代码语言:javascript
复制
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中发送clientId、scope和redirectURI。到目前为止,结果如下:

代码语言:javascript
复制
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调用?

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

更新:

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

  • 微软认证库(MSAL)客户端库可用于.NET、JavaScript、Android和Objective。所有平台都处于生产支持的预览阶段,如果引入了破坏性的更改,Microsoft将保证提供升级路径。
  • 微软的服务器中间件可用于.NET Core和ASP.NET (OWIN OpenID Connect和OAuth)和Node.js (Microsoft Passport.js)。
  • v2.0端点与许多第三方身份验证库兼容。

overview

我试过MSAL和AppAuth,但是他们没有给我任何回应。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-12 05:55:06

@Paulw11 11找到了答案。

我使用的是一种方法,在XCode 9.3和iOS 11.3之前,该方法工作得很好:

代码语言:javascript
复制
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    return true
}

但是,为了使其工作,我不得不更改如下方法:

代码语言:javascript
复制
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
    return true
}
票数 3
EN

Stack Overflow用户

发布于 2018-06-04 16:07:58

这在Xcode 9.4中是固定的,并且在我们测试它的时候工作得很好。Xcode 9.3确实存在一个问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49773318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档