我之前一直使用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中发送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调用?
如果你知道更好的解决方案或任何建议,我会很高兴收到他们!这是我第一个使用登录的项目,因为我对Swift相当陌生。
更新:
我还可以提到Microsoft文档建议使用以下库:
我试过MSAL和AppAuth,但是他们没有给我任何回应。
发布于 2018-04-12 05:55:06
@Paulw11 11找到了答案。
我使用的是一种方法,在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
}发布于 2018-06-04 16:07:58
这在Xcode 9.4中是固定的,并且在我们测试它的时候工作得很好。Xcode 9.3确实存在一个问题
https://stackoverflow.com/questions/49773318
复制相似问题