AWS Cognito API `AWSMobileClient.default (). AddUserStateListener` запускается только при изменении состояния аутентификации пользователя - PullRequest
0 голосов
/ 17 апреля 2020

Я использую Xcode 11 с Swift 4. Я следую документы для aws Cognito здесь https://aws-amplify.github.io/docs/ios/authentication и в AppDelegate.swift, у меня есть:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    // initialize AWS amplify
    let apiPlugin = AWSAPIPlugin(modelRegistration: AmplifyModels())

    do {
        try Amplify.add(plugin: apiPlugin)
        try Amplify.configure()
    } catch {
        // Navigate to page showing bad network connection
        print("Failed to configure Amplify \(error)")
    }

    AWSMobileClient.default().addUserStateListener(self) { (userState, info) in
        switch (userState) {
            case .signedOut:
                // user clicked signout button and signedout
                print("AppDelegate.application state: user signed out")
            case .signedIn:
                print("AppDelegate.application state: user signed in: \(userState)")
            case .signedOutUserPoolsTokenInvalid:
                print("need to login again.")
            default:
                print("unsupported")
        }
    }

    return true
}

AWSMobileClient.default().addUserStateListener срабатывает только при первом входе или входе пользователя в систему. если пользователь уже аутентифицирован. тогда addUserStateListener не стреляет. Это проблема, потому что мне нужно получить токен учетной записи пользователя для доступа к его / ее информации. Я использую неправильный Cognito API? Или addUserStateListener используется в неправильной функции.

Если я использую другой Cognito API

AWSMobileClient.default().initialize { (userState, error) ... }

Он срабатывает каждый раз, но я не могу получить доступ к токену пользователя из этого API.

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете получить доступ к токену пользователя с помощью API-интерфейса AWSAppSyn c, и этот метод в вашем приложении делегируется либо путем расширения appDelegate, либо с помощью собственного пользовательского класса, как я сделал.

class CognitoPoolProvider : AWSCognitoUserPoolsAuthProviderAsync {


    func getLatestAuthToken(_ callback: @escaping (String?, Error?) -> Void) {

        AWSMobileClient.default().getTokens { (token, error) in

            if let error = error {
                callback(nil,error)
            }
            callback(token?.accessToken?.tokenString, error)
        }
    }
}

Итак, в my appDelegate Я сделал что-то подобное

var appSyncClientBridge : AWSAppSyncClient?

    /// Sets the configuration settings for application's AWSAppSync Client.
    func appSyncSetup()throws -> AWSAppSyncClientConfiguration{

        let cache = try AWSAppSyncCacheConfiguration()
        let serviceConfig = try AWSAppSyncServiceConfig()

        let appSyncConfiguration = try AWSAppSyncClientConfiguration(appSyncServiceConfig: serviceConfig,
                                                                     userPoolsAuthProvider: CognitoPoolProvider(),
                                                                     cacheConfiguration: cache)


        return appSyncConfiguration
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        do {
            let configFile = try appSyncSetup()
            appSyncClientBridge = try AWSAppSyncClient(appSyncConfig: configFile)
        }
        catch(let error){
            print(error.localizedDescription)
        }

        return true
    }

ОБНОВЛЕНИЕ:

Если пользователь уже вошел в систему. Вы можете создать такой метод.

func getTokens(){
        let getPool = CognitoPoolProvider()

        func getToken(completion: @escaping (Result<String,Error>)->Void){
            getPool.getLatestAuthToken { (token, error) in
                if let error = error {
                    completion(.failure(error))
                }
                if let token = token {
                    completion(.success(token))
                }
            }
        }

        getToken { (result) in
            print(("This is the token — \(String(describing: try? result.get() as String))"))
        }
    }

Если вы поместите это в viewDidLoad, вы сможете получить доступ к токену пользователя. В этом примере он просто распечатан, но я думаю, что отсюда вы сможете использовать его для того, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...