使用AWS Amplify和Android使用Cognito对REST API进行身份验证

时间:2020-02-17 13:26:12

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

我目前正在尝试配置使用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会自动使用AWS_IAM将API设置为受限,这就是为什么返回上述消息的原因。我正在尝试使用在身份验证步骤之前设置的用户池来进行身份验证。我的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);
    }
  });
});

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

1 个答案:

答案 0 :(得分:3)

已经弄清楚了。尽管Amplify旨在在进行API调用时自动获取凭据,但它似乎还是会引发未授权的错误。当我使用控制台进行测试时,它工作正常。我必须手动将授权标头添加到其余选项:

.
相关问题