Amazon web services AWS Cognito和API网关身份验证

Amazon web services AWS Cognito和API网关身份验证,amazon-web-services,aws-lambda,aws-api-gateway,amazon-cognito,amazon-iam,Amazon Web Services,Aws Lambda,Aws Api Gateway,Amazon Cognito,Amazon Iam,我在API网关(Auth:AWS_IAM)下设置了一个GET方法,并有一个具有开发人员身份的Cognito池。我有一个lambda后面的get方法 当我打电话给Cognito时,我会得到临时凭证,并担任一个角色。我假定的角色具有执行和访问API网关上所有内容的适当权限 ... { "Effect": "Allow", "Action": [ "execute-api:Invoke"

我在API网关(Auth:AWS_IAM)下设置了一个GET方法,并有一个具有开发人员身份的Cognito池。我有一个lambda后面的get方法

当我打电话给Cognito时,我会得到临时凭证,并担任一个角色。我假定的角色具有执行和访问API网关上所有内容的适当权限

       ...
       {
            "Effect": "Allow",
            "Action": [
                "execute-api:Invoke"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "apigateway:GET"
            ],
            "Resource": [
                "*"
            ]
        }
        ...
当我用这个设置调用API网关时,我得到一个500的内部服务器错误

如果我从策略中删除上述API网关权限,则我将获得
403错误禁止(用户:arn:aws:sts::xxxxx:假定角色/Cogn\u Auth\u角色/xxx无权执行:对资源执行API:Invoke:arn:aws:execute API:us-east-1:xxxx:xxx/get/events


如果我将
AdminAccess
附加到此角色,则一切正常。这里的交易是什么?我是否遗漏了什么?

如果您只是尝试使用Cognito凭据调用API网关API,那么您可能不需要“apigateway:GET”在您的策略中。因为它用于管理您的API,例如获取有关您的API资源的信息


如果您只是尝试创建一个角色以便可以调用API,那么您可以尝试从策略中删除“apigateway:GET”并查看它是否有效。更多信息。

如果您只是尝试使用Cognito凭据调用API网关API,那么您可能不需要“apigateway:GET”在您的策略中。因为它用于管理您的API,例如获取有关您的API资源的信息


如果您只是试图创建一个角色以便调用API,那么您可以尝试从策略中删除“apigateway:GET”并查看它是否有效。更多信息。

因此,在像这样修改cognito角色的策略后,它开始正常工作

  {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "lambda:InvokeFunction"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "execute-api:Invoke"
                ],
                "Resource": [
                    "*"
                ]
            }
        ]
    }
使其发挥作用的重要因素是:

  {
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": [
            "*"
        ]
    }

仍然不确定为什么我应该拥有对所有lambda的invoke权限。

所以在像这样修改cognito角色的策略后,它开始正常工作

  {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "lambda:InvokeFunction"
                ],
                "Resource": [
                    "*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "execute-api:Invoke"
                ],
                "Resource": [
                    "*"
                ]
            }
        ]
    }
使其发挥作用的重要因素是:

  {
        "Effect": "Allow",
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Resource": [
            "*"
        ]
    }

仍然不确定为什么我应该拥有对所有lambda的调用权限。

这也可能是因为您的API网关资源策略中有一个条件,该条件只允许满足该要求的客户端访问。如果您访问API网关以与Postman一起测试,则您将收到未经授权的错误。F或者举个例子

"Condition": {
        "StringLike": {
            "aws:Referer": [
                "https://example.com/*",
                "example.com/*"
            ]
          }
         }

这也可能是由于您的API网关资源策略中存在一个条件,该条件只允许满足要求的客户端访问。如果您访问API网关进行邮递员测试,则会出现未经授权的错误。例如

"Condition": {
        "StringLike": {
            "aws:Referer": [
                "https://example.com/*",
                "example.com/*"
            ]
          }
         }

谢谢,我找到了答案,并将在这里发布我的答案。谢谢,我找到了答案,并将在这里发布我的答案。嗨,约翰尼,你成功了吗?是的,请看下面的第二个答案。我需要的是lambada调用。试试AWS策略模拟器,看看如果你遇到这种情况,你错过了什么权限。非常感谢@johnny。让我试试有lambda调用。但是我很困惑,我们不能使用带有cognito和没有lambda的API网关?我认为这取决于您的体系结构,但一般来说,您应该能够一起使用它们。此文件策略位于何处?嗨,johnny,您成功了吗?是的,请参阅下面的第二个答案。我需要的是lambda调用。请尝试AWS策略模拟器,看看如果你遇到这样的情况,你会错过什么权限。非常感谢@johnny。让我试试lambda调用。但我很困惑,我们不能将API网关与cognito和lambda一起使用?我认为这取决于你的架构,但一般来说,你应该能够一起使用它们。这个文件策略位于哪里?