【问题标题】:Authenticating a REST API with Cognito using AWS Amplify & Android使用 AWS Amplify 和 Android 通过 Cognito 对 REST API 进行身份验证
【发布时间】:2020-06-01 10:44:03
【问题描述】:

我目前正在尝试配置使用 AWS Amplify 添加的 REST API。我已经配置了用户身份验证,用户可以按照authentication docs 中列出的步骤进行注册和登录。然后我使用api steps 添加了一个 REST API。

目前,我只是想从 DynamoDB 中检索项目列表。当我在 aws 控制台上测试它时,api 是成功的,但是,当我从我的 android api 进行调用时,它返回以下错误:

{"message":"Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=[a long string of characters]

我了解 amplify 会自动将 API 设置为使用 AWS_IAM 进行限制,我认为这就是返回上述消息的原因。我正在尝试使用我之前通过身份验证步骤设置的用户池对其进行身份验证。在我的 android 应用程序中调用 API 的代码如下:

RestOptions options = new RestOptions("/models");

Amplify.API.get("modelsapi", options, new ResultListener<RestResponse>() {
    @Override
    public void onResult(RestResponse restResponse) {
        Log.i(TAG, restResponse.toString());
        Log.i(TAG, restResponse.getData().asString());
    }

    @Override
    public void onError(Throwable throwable) {
        Log.e(TAG, throwable.toString());
    }
});

我需要在 AWS api 控制台上设置授权人吗?如果是这样,我如何通过用户令牌传递授权标头。我看到一些使用 react native 但不使用 android 的人的回复:AWS-amplify Including the cognito Authorization header in the request

如果需要,Api调用的函数如下:

app.get(path, function(req, res) {

  let queryParams = {
    TableName: tableName
  }

  dynamodb.scan(queryParams, (err, data) => {
    if (err) {
      res.statusCode = 500;
      res.json({error: 'Could not load items: ' + err});
    } else {
      res.json(data.Items);
    }
  });
});

任何积分/帮助将不胜感激!谢谢!

【问题讨论】:

标签: android aws-api-gateway amazon-cognito aws-amplify aws-amplify-sdk-android


【解决方案1】:

想通了。尽管 Amplify 旨在在进行 API 调用时自动获取凭据,但它似乎还是抛出了未经授权的错误。当我使用控制台进行测试时,它运行良好。我必须手动将授权标头添加到 Rest 选项:

RestOptions options = RestOptions.builder()
                .addPath("models")
                .addHeader("Authorization", token.getTokenString())
                .build();

【讨论】:

  • 令牌可以来自很多地方,我使用了AWSMobileClient.getInstance().getTokens,它返回应用上下文的身份验证令牌。自从我上次使用 Amplify 以来,关于 Amplify 身份验证的文档似乎发生了很大变化,但可以在此处找到身份验证文档 docs.amplify.aws/lib/auth/getting-started/q/platform/…
猜你喜欢
  • 2020-01-01
  • 2021-04-08
  • 2020-09-06
  • 2018-08-27
  • 1970-01-01
  • 2017-05-23
  • 1970-01-01
  • 2019-12-31
  • 2017-12-03
相关资源
最近更新 更多