【问题标题】:DynamoDB - The security token included in the request is expiredDynamoDB - 请求中包含的安全令牌已过期
【发布时间】:2015-07-06 15:50:29
【问题描述】:

我正在尝试将一些信息保存到我的 DynamoDB 表中。该表已创建,但我收到以下错误。

Caused by: com.amazonaws.AmazonServiceException: The security token included in the 
request is expired (Service: AmazonDynamoDBv2; Status Code: 400; Error Code:     
ExpiredTokenException; Request ID: MA87ST04UPA57CMUJQIS8DBS4FVV4KQNSO5AEMVJF66Q9ASUAAJG)

值得注意的是,我设法将信息保存了一次,但在第一次之后就不再保存了。

这是我的代码。

public class SignUp extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.test);

        if (android.os.Build.VERSION.SDK_INT > 9) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);
        }
    }

    public void signUp(View view){
        CognitoCachingCredentialsProvider cognitoProvider = new CognitoCachingCredentialsProvider(
            this,    // get the context for the current activity
            "us-east-1:xxxxx",    /* Identity Pool ID */
            Regions.US_EAST_1           /* Region */
        );

        AmazonDynamoDBClient ddbClient = new AmazonDynamoDBClient(cognitoProvider);

        DynamoDBMapper mapper = new DynamoDBMapper(ddbClient);

        TextView name = (TextView)findViewById(R.id.Name);
        TextView email = (TextView)findViewById(R.id.email);
        TextView username = (TextView)findViewById(R.id.username);
        TextView password = (TextView)findViewById(R.id.password);
        TextView phone = (TextView)findViewById(R.id.phone);

        UserInfo userInfo = new UserInfo();
        userInfo.setName(name.getText().toString());
        userInfo.setEmail(email.getText().toString());
        userInfo.setUsername(username.getText().toString());
        userInfo.setPassword(password.getText().toString());
        userInfo.setPhone(phone.getText().toString());

        mapper.save(userInfo);

        Toast.makeText(this, "Finished!", Toast.LENGTH_LONG).show();

    }
}

感谢所有帮助。

【问题讨论】:

标签: android amazon-web-services amazon-dynamodb amazon-cognito


【解决方案1】:

此错误与 2 月 Cognito 公告无关。在我看来,这就像一个时钟偏差错误。如果您将模拟器打开了一段时间或更改了手机上的时钟,则从 SDK 生成的令牌可能与 AWS 所期望的不匹配...... SDK 应该会自动纠正时钟偏差错误。您可以检查设备/模拟器上的时钟,看看这是否是问题所在?如果是的话,我会对帮助改进 SDK 的确切情况感兴趣。

谢谢, 韦斯顿

【讨论】:

  • 模拟器与系统时间同步。但是当我在模拟器中重置内容和设置时,我解决了这个问题。仍然需要知道它发生的原因:)
【解决方案2】:

如果以前有效,现在无效,可能与此有关 AWS官方announcement

如果您在 2015 年 2 月之前创建了身份池,则需要将角色与身份池重新关联才能使用此构造函数。为此,请打开 cognito 控制台,选择您的身份池,单击编辑身份池,指定您的已验证和未验证角色,然后保存更改。

上述构造函数是这样的:

CognitoCachingCredentialsProvider cognitoProvider = new  CognitoCachingCredentialsProvider(
    myActivity.getContext(),    // get the context for the current activity
    "COGNITO_IDENTITY_POOL",    /* Identity Pool ID */
    Regions.US_EAST_1           /* Region */);

【讨论】:

    【解决方案3】:

    没关系...在跳来跳去时,我误读了上面的 Java 代码,实际上它正确地传递了一个 AWSCredentialsProvider(而不是只是 AWSCredentials)。

    【讨论】:

      猜你喜欢
      • 2016-06-11
      • 2020-01-11
      • 2016-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 2021-04-23
      • 1970-01-01
      相关资源
      最近更新 更多