API 网关不接受 AWS Cognito 生成的凭证



我已经设置了启用了授权的 API 网关终端节点作为 IAM。

首先,我尝试使用自己的用户凭据(密钥、机密)访问资源,它奏效了。

然后,我使用身份池设置了 Cognito。池允许经过身份验证和未经身份验证的访问。我使用 PHP SDK 生成了凭据:

$id = $cognitoClient->getId([
        'AccountId' => 'xxx',
        'IdentityPoolId' => 'xxx', 
    ]);
$credentials = $cognitoClient->getCredentialsForIdentity([
    'IdentityId' => $id->get('IdentityId')
])->get('Credentials');

这能够生成凭据 - AccessKeyIdSecretKeySessionToken正在返回。

我附加的未经身份验证的访问权限的角色定义如下:

信任关系:

{
   "Version": "2012-10-17",
   "Statement": [
     {
       "Effect": "Allow",
       "Principal": {
         "Federated": "cognito-identity.amazonaws.com"
       },
       "Action": "sts:AssumeRoleWithWebIdentity",
       "Condition": {
         "StringEquals": {
           "cognito-identity.amazonaws.com:aud": "xxx"
         }
       }
     }
  ]
}

内联策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": "cognito-sync:*",
        "Resource": [
            "arn:aws:cognito-sync:us-east-1:123456789012:identitypool/${cognito-identity.amazonaws.com:aud}/identity/${cognito-identity.amazonaws.com:sub}/*"
        ]
    }
  ]
}
{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": "cognito-sync:*",
        "Resource": [
            "arn:aws:cognito-sync:us-east-1:xxxxx:identitypool/*"
        ]
    }
  ]
}
{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Effect": "Allow",
        "Action": [
            "apigateway:*"
        ],
        "Resource": [
            "*"
        ]
    }
  ]
}

我尚未为角色附加任何托管策略。

现在,在使用 PHP SDK 生成凭据后,我使用 postman 来访问资源(我也在使用我的帐户信条时使用 postman)。此调用给出以下错误:

{"message":"The security token included in the request is invalid."}

我无法确定这里出了什么问题。

现在,我已经改用可以为每个部署生成的 Javascript SDK。

使用 SDK 可以解决问题。我观察到的一件事是,我必须在SDK中传递我之前没有传递的会话令牌(我不知道把它放在哪里)。

TL;DR :要让它与 Postman 一起工作,您必须在名为 X-Amz-Security-Token 的标头中传递您的令牌。

首先感谢,我一直在为同样的问题而苦苦挣扎,直到你自己的答案,这导致了我的解决方案。

在javascript SDK的自述文件中,您可以找到:

var apigClient = apigClientFactory.newClient({
    accessKey: 'ACCESS_KEY',
    secretKey: 'SECRET_KEY',
    sessionToken: 'SESSION_TOKEN', //OPTIONAL: If you are using temporary credentials you must include the session token
    region: 'eu-west-1' // OPTIONAL: The region where the API is deployed, by default this parameter is set to us-east-1
});

好的,所以您需要临时凭证的令牌,很高兴在 cognito 文档中而不是在这里看到它,但没关系。我辞职写一个javascript版本来测试,这显然需要CORS才能工作。在要激活 CORS 的页面上,您有默认值为 Content-Type, X-Amz-Date, Authorization, X-Api-Key, X-Amz-Security-Token 的字段Access-Control-Allow-Headers,就在那里。

相关内容

  • 没有找到相关文章

最新更新