You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
func runOauth(){
self.loadingLabel.isHidden=true
let appDelegate = UIApplication.shared.delegate as! AppDelegate
appDelegate.oauth2!.afterAuthorizeOrFail = self.callBackOAuth
var url:URL?
do{
//the url for authorizing the user, kronos://oauth/callback" is called after the OAuth finish
url = try appDelegate.oauth2!.authorizeURL(withRedirect:"kronos://oauth/callback", scope: "auth",params: ["tg":"addon/kronos/main","idx":"login.OAuth","formId":"iOS"])
do{
let authorizer = appDelegate.oauth2!.authorizer as! OAuth2Authorizer
//launch OAuth in embeded view "SafariVC"
print("Safari embeded" + url!.absoluteString)
safariVC = try authorizer.authorizeSafariEmbedded(from: self,at: url!)
}catch let error {
DispatchQueue.main.async {
print("ERROR authorizing\(error)")
//self.runOauth()
}
}
}catch let error {
DispatchQueue.main.async {
print("ERROR creating OAuth URL \(error)")
//self.runOauth()
}
}
}
func callBackOAuth(authParameters:OAuth2JSON!, error: OAuth2Error!){
let appDelegate = UIApplication.shared.delegate as! AppDelegate
print("Callback")
if (error == nil && appDelegate.oauth2!.accessToken != nil){//OAuth succeed in
//we store the token and its experation date in keychain
print("OAuth succeed")
self.keychain!.set(appDelegate.oauth2!.accessToken!,forKey:"Token")
//self.keychain!.set(appDelegate.oauth2!.refreshToken!,forKey:"RefreshToken")
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
let myString = formatter.string(from: appDelegate.oauth2!.accessTokenExpiry!)
self.keychain!.set(myString,forKey:"ExpiryDate")
self.loadingLabel.isHidden=false
appDelegate.reloadView()
}else if (error != nil){//OAUth failed
print("OAuth error \(String(describing: error))")
}else{//Another error
print("Cannot login")
self.showMessage(msg: "Login error", title: "Error")
self.runOauth()
}
}
and in AppDelegate
func application(_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
// you should probably first check if this is the callback being opened
// if your oauth2 instance lives somewhere else, adapt accordingly
let components = URLComponents(url: url, resolvingAgainstBaseURL: false)
let site=components?.host
print("Application")
if site == "oauth"{//OAuth terminated
if components?.path == "/callback" {
let viewController = self.window?.rootViewController as! ViewController
print("oauth")
self.oauth2!.handleRedirectURL(url)
viewController.hideSafariView()
}
}
return true
}
My issue is that as I trigger runOauth like that it happens that application is called before callBackOAuth so after oauth viewDidAppear is recalled but with keychain token not set, so here is a way to "wait" in application that token is not nil
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let appDelegate = UIApplication.shared.delegate as! AppDelegate
//initialize OAuth2 config parameters
appDelegate.oauth2 = OAuth2CodeGrant(settings: OAuthParams )
appDelegate.oauth2!.authConfig.authorizeContext = KronosWebsite?.window
appDelegate.oauth2!.useKeychain = false
appDelegate.oauth2!.authConfig.authorizeEmbeddedAutoDismiss = true
appDelegate.oauth2!.logger = OAuth2DebugLogger(.debug)
appDelegate.oauth2!.afterAuthorizeOrFail = self.callBackOAuth
appDelegate.oauth2!.verbose = true
//try to load the Token from keychain
let token=self.keychain!.get("Token")
if(token == nil){//no token found, we launch the OAuth
print("no token yet")
runOauth()
}
EDIT: I've tried to use a DispatchGroup with no success:
Now, I've another issue:
I've those methods
and in AppDelegate
My issue is that as I trigger
runOauth
like that it happens thatapplication
is called beforecallBackOAuth
so after oauthviewDidAppear
is recalled but with keychain token not set, so here is a way to "wait" inapplication
that token is not nilEDIT: I've tried to use a DispatchGroup with no success:
groupOauth.enter()
in runOauthgroupOauth.leave()
in callBackOAuthand in AppDelegate::application
The text was updated successfully, but these errors were encountered: