Как аутентифицировать пользователя для 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