Swift - AWS Cognito using Amplify - How to get tokens after log in in swift?

Viewed 1274

Im struggling getting user token after successfully logging in. The only thing I got is the current userId and username, but I cant get in any point the user tokens.

     func login(userData: RegistrationFields) {
        _ = Amplify.Auth.signIn(username: userData.email.data, password: userData.password.data) {
            [weak self] result in
                switch result {
                case .success(let signInResult):
                    if signInResult.isSignedIn {
                        self?.getCurrentUser()
                        debugPrint("Sign in succeeded")
                    }
                case .failure(let error):
                    debugPrint("Sign in failed \(error)")
                    self?.authStateDelegate?.authState(state: .error(error: error))
                }
            }
    }

   func getCurrentUser() {
        guard let user = Amplify.Auth.getCurrentUser() else {return}
        self.authStateDelegate?.authState(state: .session(user: user))
    }
2 Answers

In success callback of your sign in you can do next:

Amplify.Auth.fetchAuthSession { result in
        switch result {
        case .success(let session):
            if session.isSignedIn {
                do {
                    if let cognitoTokenProvider = session as? AuthCognitoTokensProvider {
                        let tokens = try cognitoTokenProvider.getCognitoTokens().get()
                        //tokens.idToken - is ID token. Access and refresh tokens also can be found here
                    }
                } catch {
                    //error
                }
            } else {
                //Not Logged in
            }
        case .failure(let error):
            print("Fetch session failed with error \(error)")
        }
    }

This is what worked for me:

First, import AmplifyPlugins

import AmplifyPlugins

And

_ = Amplify.Auth.fetchAuthSession { result in
  switch result {
  case .success(let session):
    if(session.isSignedIn) {
      if let sess = session as? AWSAuthCognitoSession {
        let result = sess.getCognitoTokens()
        switch result {
          case .success(let tokens):
            let accessToken = tokens.accessToken
            let idToken = tokens.idToken
            let refreshToken = tokens.refreshToken
          case .failure(let error):
            print("Fetch user tokens failed with error \(error)")
        }
      }
    }
  case .failure(let error):
    print("Fetch session failed with error \(error)")
  }
}
Related