2

在使用 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

4

0 回答 0