Интеграция с AWS Cognito swift3 Refresh предоставляет исключение ResourceNotFoundException

После ответа здесь: https://github.com/aws/aws-sdk-ios/issues/357 В самом низу есть мини-руководство по быстрому и когнитивному использованию.

Я сделал AWSCustomIdentityProvider таким:

import Foundation
import AWSCognitoIdentityProvider
import AWSCognito

class AWSCustomIdentityProvider: NSObject, AWSIdentityProviderManager
{

private var dict = NSDictionary()

func addToken(value:NSString)
{
    dict = ["graph.facebook.com":value]
}

public func logins() -> AWSTask<NSDictionary>
{
    return AWSTask(result: dict)
}
}

И у меня есть метод входа в систему из facebook:

public func loginButtonDidCompleteLogin(_ loginButton: FacebookLogin.LoginButton, result: FacebookLogin.LoginResult){

    switch result {
    case .failed(let error):
        print("FACEBOOK LOGIN FAILED: \(error)")
    case .cancelled:
        print("User cancelled login.")
    case .success(_, _, let accessToken):


        let customIdentity = AWSCustomIdentityProvider()
        let token = accessToken.authenticationToken
        customIdentity.addToken(value: token as NSString)

        let credentialsProvider = AWSCognitoCredentialsProvider(regionType: REGIONTYPE, identityPoolId: "XXXXXXXXXXXXXXXXXXXXXXX", identityProviderManager:customIdentity)

        credentialsProvider.clearKeychain()
        credentialsProvider.clearCredentials()

        let serviceConfiguration = AWSServiceConfiguration(region: REDIONTYPE, credentialsProvider: credentialsProvider)
        AWSServiceManager.default().defaultServiceConfiguration = serviceConfiguration;

        credentialsProvider.getIdentityId().continue( { (task: AWSTask!) -> AnyObject! in
            if (task.error != nil) {
                print("Error: " + (task.error?.localizedDescription)!)// gets called
            }
            else {
                print(task.result)//identityid
            }
            return nil
        })
    }
}

Однако я получаю сообщение об ошибке:

Домен ошибки = com.amazonaws.AWSCognitoIdentityErrorDomain Code = 8 "(null)" UserInfo = {__ type = NotAuthorizedException, message = Логины не совпадают. Включите хотя бы один действительный логин для этого идентификатора или пула идентификаторов.}

Пожалуйста, дайте мне знать, если у вас есть идеи, как решить мою проблему. Я также пробовал следовать документации и устанавливать логины напрямую "credentialsProvider.logins = {" graph.facebook.com ": mytoken}

и это создает другое исключение при вызове лямбда-метода, но ДЕЙСТВИТЕЛЬНО извлекает идентификатор identityID должным образом. Однако выполнение этого в соответствии с документами вызывает предупреждение о том, что используемый мной метод устарел.

Я получаю ошибку:

UserInfo = {NSLocalizedDescription = сериализованный объект не является ни допустимым объектом json, ни объектом NSData:}

Однако это случается только иногда. Если я попытаюсь повторить попытку, я потенциально могу получить идентификатор личности, но при вызове лямбда-метода я получаю ту же ошибку. Я предполагаю, что это проблема когнитивности.

ОБНОВЛЕНИЕ

Если я использую AWSCognitoLoginProviderKey.facebook.rawValue вместо graph.facebook.com в первой части, он дает мне идентификатор когнито, а затем я вызываю лямбда-метод. Я включу лямбда-метод на тот случай, если я ошибаюсь, но я вполне уверен, что это когнитивный метод, который мешает мне вызвать лямбда-метод:

import AWSLambda
import Foundation
struct AWSHelper{
let lambda = AWSLambda.default()
let APPLICATION_NAME = "MYAPPLICATION"
init(){

}

func getFunctionName(funcName: String) -> String{
    return "\(funcName)_\(APPLICATION_NAME)"
}

func login(facebookID: String, cognitoID:String, callback:@escaping (Bool) -> Void){
    let req = AWSLambdaInvocationRequest();
    req?.invocationType = AWSLambdaInvocationType.requestResponse
    req?.payload = ["cognitoID" : cognitoID, "facebookID" : facebookID]
    req?.functionName = getFunctionName(funcName: "MYFUNCNAME")

    lambda.invoke(req!) { (response: AWSLambdaInvocationResponse?,error: Error?) in
        print(error)
        let payload = response?.payload
        print(payload)
        callback(true)
    }

}
}

Обновление 2

Я обнаружил, что вызов такого метода обновления:

credentialsProvider.credentials().continue({ (task: AWSTask!) -> Any? in
            print(task.result)
        })

Вызывает такую ​​ошибку:

AWSiOSSDK v2.4.10 [Ошибка] Строка AWSCredentialsProvider.m: 577 | __44- [Учетные данные AWSCognitoCredentialsProvider] _block_invoke.352 | Не удалось обновить. Ошибка: [Error Domain = com.amazonaws.AWSCognitoIdentityErrorDomain Code = 10 "(null)" UserInfo = {__ type = ResourceNotFoundException, message = Identity 'us-east-1: 0db18266-1baa-4c59-9110-f9041dc92ead' not found.} ]

Я считаю, что большая строка, которая выглядит как идентификатор identitypoolID, на самом деле является идентификатором идентификатора для данного пользователя, который у меня есть, поэтому когнито распространил идентификатор, но не может его запросить?


person user2977578    schedule 27.10.2016    source источник


Ответы (2)


Ошибка:

Логины не совпадают. Пожалуйста, укажите хотя бы один действительный логин для этого идентификатора или пула идентификаторов

Также может произойти из-за того, что вы пытаетесь войти в систему как другой пользователь без выхода из системы, поэтому токен в словаре для входа сравнивается с identityId для другого идентификатора (и не совпадает). В этом случае SDK обычно восстанавливается путем повторной попытки, очистки и восстановления identityId, а затем он работает.

Но в вашем случае, поскольку вы создаете свой собственный словарь логинов, проблема, скорее всего, в том, что вы создали токен, который не соответствует. Вы можете проверить токены с помощью https://jwt.io. (хотя я признаю, что это работает для пулов пользователей Google и Cognito, но не для токенов facebook (я не знаю, почему это так)),

Я думаю, что несоответствие означает, что identityId записывает другого уникального пользователя, чем указано в токене.

Вы уверены, что токен построен правильно?

Как вы упомянули ... документация ... ну ... я считаю, что документация не стоит внимания, поэтому я настроил свои проекты, чтобы я мог просмотреть рабочий код и установить точки останова.

Вот фрагмент кода AWSSignInProvider от Mobile Hub Helper в Facebook, который показывает, что они используют для получения токена (token.tokenstring).

    - (AWSTask<NSString *> *)token {
    FBSDKAccessToken *token = [FBSDKAccessToken currentAccessToken];
    NSString *tokenString = token.tokenString;
    NSDate *idTokenExpirationDate = token.expirationDate;

    if (tokenString
        // If the cached token expires within 10 min, tries refreshing a token.
        && [idTokenExpirationDate compare:[NSDate dateWithTimeIntervalSinceNow:AWSFacebookSignInProviderTokenRefreshBuffer]] == NSOrderedDescending) {
        return [AWSTask taskWithResult:tokenString];
    }

    AWSTaskCompletionSource *taskCompletionSource = [AWSTaskCompletionSource taskCompletionSource];
    [FBSDKLoginManager renewSystemCredentials:^(ACAccountCredentialRenewResult result, NSError *error) {
        if (result == ACAccountCredentialRenewResultRenewed) {
            FBSDKAccessToken *token = [FBSDKAccessToken currentAccessToken];
            NSString *tokenString = token.tokenString;
            taskCompletionSource.result = tokenString;
        } else {
            taskCompletionSource.error = error;
        }
    }];
    return taskCompletionSource.task;
}

Также ... Это заслуживает упоминания. AWSIdentityManager и связанный с ним AWSSignInProviders - хорошая архитектура для входа в систему с Facebook и Google. Даже если вы не используете остальную часть Mobile Hub Helper. Зачем изобретать колесо, они очень хорошо поработали над идентификационной частью aws-mobilehub-helper-ios

У меня есть версия этой библиотеки, размещенная на github, которая также добавляет AWSSignInProvider для пользовательских пулов Cognito. SignIn-awsmhh для использования когнитивного пользователя необходимы некоторые исправления в aws-mobilehub-helper-ios пулы они здесь aws-mobilehub-helper-ios (так что если вы клонируете сделайте clone --recursive, и вы будете настроены для отладки с использованием точек останова в библиотеке).

person Bruce0    schedule 06.11.2016
comment
Я использовал цель C, и хотя я предпочитаю ее, мне нужно писать быстро. Swift SDK для Facebook использует authenticationToken вместо tokenString, и этот authenticationToken может быть моей проблемой. Как вы думаете, это так, или мне стоит подойти к этому по-другому? - person user2977578; 07.11.2016

Думаю, есть несколько вещей, которые заставили его работать.

Я сделал правильный шаг, создав свой собственный identityprovidermanager, и я думаю, что главным препятствием для выполнения мной лямбда-метода было то, что я использовал AWSLambda вместо AWSLambdaInvoker. После того, как я переключился, он начал делать ошибки, которые имели смысл.

person user2977578    schedule 07.11.2016
comment
Привет, у вас есть справочная документация по созданию собственного менеджера провайдеров идентификационной информации? Если да, то, пожалуйста, поделитесь с нами, тогда это будет сцена. - person Bibhudatta Sahoo; 22.12.2020