Проверка токена AWS Cognito с помощью Swift

#swift #amazon-web-services #swift3 #amazon-cognito

#swift #amazon-веб-сервисы #swift3 #amazon-cognito

Вопрос:

Я почти завершил процесс авторизации разработчика с помощью AWS. Кажется, я не могу аутентифицировать внутренний токен, который я получаю, и, похоже, не могу найти какие-либо текущие реализации, которые выполняют аутентификацию разработчика через сторонний серверный сервер. Ошибка, которую я получаю, указана ниже.

На данный момент мой код выглядит следующим образом:

Класс, содержащий пользовательский поставщик удостоверений:

 import Foundation
import AWSCognitoIdentityProvider

class CustomIdentityProvider: NSObject, AWSIdentityProviderManager {
var tokens: [NSString: NSString]?

init(tokens: [NSString: NSString]) {
    self.tokens = tokens
}

@objc func logins() -> AWSTask<NSDictionary> {
    return AWSTask(result: tokens! as NSDictionary)
}
}
 

AWS-APIManager.swift {фрагмент}

 /* obtained cognito token from my back-end via getOpenIdTokenForDeveloperIdentity*/

/* From here I my app receives an IdentityId and Token */

 let client_cognito_id = String(describing: valid_response)

 let session_token     = json.dictionaryValue["Token"]!


 let login_with_amazon = NSString(string: "cognito-identity.amazonaws.com")

 let token             = NSString(string: String(describing: session_token))



 let customProviderManager = CustomIdentityProvider(tokens:  [login_with_amazon: token])

 let credentialsProvider = AWSCognitoCredentialsProvider(
                        regionType: self.AWS_REGION,
                        identityPoolId: "us-east-1:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
                        identityProviderManager: customProviderManager
                    )


                        credentialsProvider.setIdentityProviderManagerOnce(customProviderManager)
                        credentialsProvider.getIdentityId().continue ({ (task: AWSTask!) -> AnyObject! in

                            if (task.error != nil) {
                                print("Error!!!: "   (task.error?.localizedDescription)!)

                            } else {
                                // the task result will contain the identity id
                                let cognitoId = task.result
                                print(cognitoId)
                                print("SUCCESS!!!")
                            }
                            return nil
                        })

                }
 

По какой-то странной причине я не могу аутентифицировать полученный токен. Я получаю сообщение об ошибке «Недопустимый токен входа. Не удается передать токен Cognito «.. Я пытался следовать документации и собирать рабочий код, который я нашел буквально в сотнях источников, и, похоже, не могу пройти мимо этой части процесса аутентификации. Буду признателен за любую помощь. Спасибо!

Ответ №1:

Я полагаю, что проблема здесь в том, что, хотя вы предоставляете токен, вы не устанавливаете идентификационный идентификатор, который вы получаете от своего серверной части. Таким образом, он вызывает getId с помощью Cognito OpenIdConnectToken, который не поддерживается.

Простейшая клиентская реализация удостоверений, прошедших проверку подлинности разработчика, заключается в расширении AWSCognitoCredentialsProviderHelper

Приносим извинения за предоставление этого в Objective C вместо Swift. В вашей реализации просто переопределите метод token.

 - (AWSTask<NSString *> *)token {
    //get the identity id and token from your server
    //You can use AWSTaskCompletionSource if you don't have it and need to get it asynchronously.
    //Once you have this information, simply set the identity id and return the token
    self.identityId = identityId;
    return [AWSTask taskWithResult:token];
}