Skip to content

Instantly share code, notes, and snippets.

@ngothanhtai
Last active April 7, 2016 16:07
Show Gist options
  • Save ngothanhtai/049fd9052dc808d6105dddc057c82253 to your computer and use it in GitHub Desktop.
Save ngothanhtai/049fd9052dc808d6105dddc057c82253 to your computer and use it in GitHub Desktop.
Auth0 + AWS Cognito
import Foundation
import AWSCognito
import Lock
import JWTDecode
class LoginManager {
let provider: AWSCognitoCredentialsProvider
init() {
AWSLogger.defaultLogger().logLevel = AWSLogLevel.None
self.provider = AWSCognitoCredentialsProvider.init(regionType: AWSRegionType.USEast1, identityPoolId: CognitoConfig.CognitoPoolID)
let configuration = AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: self.provider);
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
}
func completeLogin(token : A0Token, _ profile: A0UserProfile, _ success : () -> (), _ failure : (NSError) -> ()) {
UserProfile.current.idToken = token.idToken
UserProfile.current.refreshToken = token.refreshToken
UserProfile.current.a0UserProfile = profile
doAmazonLogin(token.idToken, success, failure);
}
func doAmazonLogin(idToken: String, _ success : () -> (), _ failure : (NSError) -> ()) {
self.provider.logins = [CognitoConfig.IDPUrl: idToken]
self.provider.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in
self.provider.refresh()
dispatch_async(dispatch_get_main_queue(), { () -> Void in
if let error = task.error {
failure(error);
} else {
success()
}
})
return nil
}
}
func doAmazonLoginForUnauthenticate() {
self.provider.logins = [NSObject: AnyObject]()
self.provider.getIdentityId().continueWithBlock { (task: AWSTask!) -> AnyObject! in
self.provider.refresh()
return nil
}
}
func resumeLogin(success : () -> (), _ failure : (NSError) -> ()) {
let keychain = MyApplication.sharedInstance.keychain
let idToken = UserProfile.current.idToken
if let idToken = idToken {
let jwtDecoder = JWTDecoder(jwt: idToken)
if (jwtDecoder.expired) {
let refreshToken = UserProfile.current.refreshToken
let refreshOk = {(token:A0Token!) -> () in
UserProfile.current.idToken = token.idToken
self.doAmazonLogin(token.idToken, success, failure);
}
let refreshFail = {(error:NSError!) -> () in
keychain.removeAllItems()
failure(error)
}
if let refreshToken = refreshToken {
A0Lock.sharedLock().apiClient().fetchNewIdTokenWithRefreshToken(refreshToken, parameters: nil, success: refreshOk, failure: refreshFail)
} else {
let error = NSError(domain: "com.auth0", code: 0, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("Something went wrong", comment: "This is an error")])
refreshFail(error)
}
} else {
doAmazonLogin(idToken, success, failure);
}
} else {
let error = NSError(domain: "com.auth0", code: 0, userInfo: [NSLocalizedDescriptionKey: NSLocalizedString("Something went wrong", comment: "This is an error")])
doAmazonLoginForUnauthenticate()
failure(error)
}
}
func logOut() {
A0Lock.sharedLock().apiClient().logout()
let keychain = MyApplication.sharedInstance.keychain
keychain.removeAllItems()
provider.logins = nil
if let cognito = AWSCognito.defaultCognito() {
cognito.wipe()
}
provider.clearKeychain()
provider.clearCredentials()
A0Lock.sharedLock().clearSessions()
UserProfile.current.logOut()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment