我设置了API网关端点,并启用了IAM授权。
首先,我尝试使用自己的用户凭据(密钥,密钥)访问资源,但它确实有效。
然后,我使用身份池设置了Cognito。池允许 - 经过身份验证和未经身份验证的访问。 我使用PHP SDK生成凭证:
$id = $cognitoClient->getId([
'AccountId' => 'xxx',
'IdentityPoolId' => 'xxx',
]);
$credentials = $cognitoClient->getCredentialsForIdentity([
'IdentityId' => $id->get('IdentityId')
])->get('Credentials');
这可以生成凭据 - 正在返回AccessKeyId
,SecretKey
和SessionToken
。
我附加了未经身份验证的访问权限的角色定义如下:
信任关系:
{
"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."}
我无法确定这里出了什么问题。
答案 0 :(得分:3)
目前,我已切换到使用可为每个部署生成的Javascript SDK。
使用SDK解决了这个问题。我观察到的一件事是,我之前在SDK中传递会话令牌(我不知道在哪里放置它)。
答案 1 :(得分:2)
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 doc而不是在这里,但好的。我辞职写了一个javascript版本来测试,显然需要CORS才能工作。在激活CORS的页面上,您有Access-Control-Allow-Headers
字段,其默认值为Content-Type, X-Amz-Date, Authorization, X-Api-Key, X-Amz-Security-Token
,并且就在那里。