Как аутентифицировать пользователя для AWS DynamoDB, используя Cognito User Pools и Cognito Identity, на Xamarin в iOS?

В приложении для iOS, написанном с использованием Xamarin, я пытаюсь разрешить пользователю входить в AWS с помощью пулов пользователей Cognito, а затем разрешать им читать данные из экземпляра DynamoDB.

Моя настройка: я создал пользователя в своем пуле пользователей, настроил его роль IAM, все это. И на самом деле, логин, кажется, работает. Моя проблема (я думаю) заключается в том, что после того, как пользователь вошел в систему, передача этого контекста входа клиенту Dynamo DB.

Вот как выглядит код ViewController в моем приложении для iOS:

public static CognitoUser regUser; //ugly static for now

... 

private async void BtnDoLogin_TouchUpInside(object sender, EventArgs e)
{
    string username = txtAWSUsername.Text;
    string password = txtAWSPassword.Text;
    var res = await AttemptLogin(username, password);
    System.Console.WriteLine("--->>> AuthFlowResponse is: " + res.AuthenticationResult);
    TryDynamoStuff(regUser);
}

public static async Task<AuthFlowResponse> AttemptLogin(string username, string password)
{
    //temporarily hardcoding creds just to be sure they're correct
    username = "my-user";
    password = "users-password-here";
    string CognitoIdentityPoolId = "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";

    var provider = new AmazonCognitoIdentityProviderClient(new AnonymousAWSCredentials(),
                                                           FallbackRegionFactory.GetRegionEndpoint());

    CognitoUserPool userPool = new CognitoUserPool("us-east-1_aaaaaaaaa", "yyyyyyyyyyyyyyyyyy", provider);
    regUser = new CognitoUser(username,
                                "yyyyyyyyyyyyyyyyyy",
                                userPool,
                                provider,
                                "zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz");

    AuthFlowResponse context = await regUser.StartWithSrpAuthAsync(new InitiateSrpAuthRequest()
    {
        Password = password
    }).ConfigureAwait(false);

    return;
}

public static void TryDynamoStuff(CognitoUser user) //"user" not used atm
{
    string CognitoIdentityPoolId = "us-east-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    CognitoAWSCredentials credentials = regUser.GetCognitoAWSCredentials(CognitoIdentityPoolId, RegionEndpoint.USEast1); //// ---------------------> EXCEPTION IS THROWN HERE

    var client = new AmazonDynamoDBClient(credentials,region);
    DynamoDBContext context = new DynamoDBContext(client);
}

Исключение, генерируемое во время TryDynamoStuff:

Amazon.CognitoIdentityProvider.Model.NotAuthorizedException: User is not authenticated. occurred

Что я не понимаю, почему? "RegUser", даже если я передаю экземпляр вместо статической переменной var, должен быть аутентифицирован?

Установка точки останова непосредственно перед сбоем Я даже подтвердил, что контексту AWSFlowResponse назначен идентификатор сеанса.

Есть ли что-то еще, что мне нужно сделать, чтобы этот контекст AWSFlowResponse применялся к входу в систему Dynamo?

Для всех, кто может помочь - ты мой герой.

Рекомендации

Код Amazon: релиз Amazon.Extensions.CognitoAuthentication

Еще один пример кода от AWS: CognitoHelper.cs

Хранение и извлечение данных из DynamoDB: Документы AWS

0 ответов

Другие вопросы по тегам