在使用 Xamarin 编写的 iOS 应用程序中,我试图允许用户使用 Cognito 用户池登录 AWS,然后允许他们从 DynamoDB 实例中读取数据。
我的设置是:我在我的用户池中创建了一个用户,配置了他们的 IAM 角色,所有这些。事实上,登录似乎有效。我的问题(我认为)是用户登录后,将该登录上下文传递给 Dynamo DB 客户端。
这是我的 iOS 应用程序中的 ViewController 代码的样子:
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”,即使我传递一个实例而不是使用静态变量,也应该进行身份验证?
在崩溃之前设置断点我什至已经确认 AWSFlowResponse 上下文已分配了会话 ID。
我还需要做些什么来让 AWSFlowResponse 上下文应用于 Dynamo 登录吗?
对于任何可以提供帮助的人——你是我的英雄。
参考
亚马逊的代码:Amazon.Extensions.CognitoAuthentication 发布
AWS 的另一个代码示例:CognitoHelper.cs
从 DynamoDB 存储和检索数据:AWS Docs