【问题标题】:Authorization using Api gateway and Lambda使用 Api 网关和 Lambda 进行授权
【发布时间】:2019-12-09 19:59:17
【问题描述】:

您好,我正在尝试使用 api 网关和 lambda 实现自定义授权。我目前的理解如下。我创建了简单的 GET 方法并部署到 Dev Enviroment。创建 lambda 授权以返回 IAM 策略。我使用了 python blue print api-gateway-authorizer-python。下面是我们应该得到的响应格式。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "execute-api:Invoke",
      "Effect": "Deny",
      "Resource": "arn:aws:execute-api:us-east-1:{ACCOUNTID}:{APIID}/ESTestInvoke-stage/GET/"
    }
  ]
}

在上述 IAM 政策中,Resource 是我的 Api Dev 阶段的 ARN。什么是行动指示?现在也要测试一下,我怎样才能得到令牌?我想从邮递员那里测试它?我只是在这里感到困惑。我有我的 AWS 账户并且授权只是我当前的账户可以访问这个开发阶段?它在内部如何运作?要存储所有权限,我们是否需要维护任何其他数据库?有人可以帮助我理解这一点吗?任何帮助,将不胜感激。谢谢

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway serverless


    【解决方案1】:

    要获得令牌,您需要身份提供者。 Amazon Cognito 就是其中之一(谷歌、Facebook 也可以)。要了解该策略,您必须了解命令链

    假设客户端调用 API 端点 (GET /orders),这将触发服务 Lambda,以便验证令牌。如果验证成功,Api Gateway 会调用另一个 Lambda(GetOrder这次是业务 Lambda)。

    如果您的服务 Lambda(Lambda 授权方)将返回如下策略:

    {
        "principalId": "apigateway.amazonaws.com",
        "policyDocument": {
            "Version": "2012-10-17",
            "Statement": [{
                "Action": "execute-api:Invoke",
                "Effect": "Allow",
                "Resource": "arn:aws:execute-api:{REGION}:{ACCOUNT_ID}:{API_ID}/Prod/GET/"
            }]
        }
    }
    

    API网关服务(即principalId等于apigateway.amazonaws.com)被允许(即Effect等于Allow)调用(即Action等于execute-api:Invoke)给定的API资源(例如Resource 等于 arn:aws:execute-api:{REGION}:{ACCOUNT_ID}:{API_ID}/Prod/GET/)。

    在您的情况下,您返回的 ARN 与 API Gateway 的测试器相关,但它应该指向您的真实功能。

    This 文章可能会有所帮助。

    【讨论】:

    • 感谢您的回答。如果我们需要精细的级别控制,那我们怎么做呢?
    • 您唯一的方法是在 JWT 中使用自定义声明,因此您可以拥有一个属性 role: admin 并且在评估时(即当您的 Lambda 授权方正在运行时)您可以决定该函数是否 ( es: DeleteOrder) 可以由管理员调用。 Lambda 授权方在事件参数中获取有关目标函数的信息。
    【解决方案2】:

    好的,API 网关的自定义授权者是什么:自定义授权者让您可以定义自己的身份验证和授权逻辑。

    您如何获取令牌:这是您的身份验证和授权逻辑的一部分,如果您在 AWS 上部署服务,则可以使用 AWS cognito。 API 网关还支持 cognito 授权。 https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html

    使用邮递员测试?使用邮递员很方便。我用它。

    权限在内部如何工作:您可以使用令牌对用户进行身份验证。 (如果您使用的是 JWT 令牌,您还可以验证用户的声明)。

    您需要内部数据库吗?这完全取决于您的用例。如果您的用例很简单,因为所有用户都被平等对待,那么您可能不需要 db。假设某些用户可以访问一些附加功能,您可能仍然不需要数据库(您可以使用声明)。但是如果您的应用程序变得复杂并且您必须管理不同的访问权限、用户、组等,您可能肯定需要一个 db。

    【讨论】:

    • 感谢您的回答。邮递员中的AWS签名是什么?这也用于获取令牌?授权不过是每当用户发送令牌时,该用户就可以访问 api 网关内的特定 api 吗?但是这个映射会在哪里呢?例如,此特定用户有权访问此特定 api?
    • 如果你在API Gateway上使用AWS_IAM,那么你使用邮递员的AWS signature
    • 是的,如果我正在使用 Iam。如果是 iam,授权将如何工作
    • 如果 IAM 凭证有效,则调用端点成功。如果您使用 lambda,则 lambda 从其 IAM 角色获取权限。
    猜你喜欢
    • 2019-11-18
    • 2017-09-04
    • 2020-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2014-08-05
    • 2020-01-12
    相关资源
    最近更新 更多