向客户端公开受Cognito保护的AWSGateway API

时间:2018-12-10 05:52:07

标签: rest amazon-web-services api aws-api-gateway amazon-cognito

用例: 我们有一些AWSGateway API,我们的客户可以使用它们在后端做一些事情。这些API受Cognito保护。目前,我们的客户正在通过使用Cognito Mobile SDK构建的android应用程序使用此APIS。

现在,我们正在尝试向客户公开这些API,以将其集成到其内部工作流程中。

我试图找到最好的方法。目前,我找不到任何有关执行此操作的资源。

我似乎是AWS Cognito的服务器端用户,但我认为这不是我们要在这里做的事情。

谢谢。

3 个答案:

答案 0 :(得分:0)

我想这将是服务到服务或(服务器到服务器)通信,因为使用的该术语是Oauth Standard是client_credentials授予类型。

请参阅文档以获取token 获取令牌后,您需要传递此令牌AuthorizationAPI Gateway Custom Header for AWS Cognito

答案 1 :(得分:0)

要正确回答您的问题,我们需要更多信息。

  • 内部工作流程是否可以配置为使用REST服务?
  • 内部工作流程支持哪些身份验证过程?

SDK或没有SDK

您可以通过生成的SDK或您自己的代码访问API Gateway中的Web服务。 在here中找到了从API网关控制台生成SDK的说明。

要通过身份验证调用Web服务,可以通过IAM,API密钥,Cognito,自定义授权者四种方式来完成。我要提到前三个。

IAM

  • 步骤1,使用访问密钥和秘密密钥在IAM中创建一个用户。
  • 第2步也设置了一个角色,以使用IAM访问API。去 IAM,选择角色,创建角色,并授予其对您的访问权限 API网关功能。看起来像这样:

示例IAM策略:

{
   "Version": "2012-10-17",
   "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::account-id:user/Alice",
                    "account-id"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "arn:aws:execute-api:region:account-id:api-id/stage/GET/pets"
            ]
        }
    ]
}

将此角色分配给您创建的用户。政策示例可用here.。有关包括本地证书等的更多身份验证选项,请查看here

  • 第3步,使用AWS Secret and Key SDK调用API。

API密钥

如果您将密钥添加到您的API,则移动应用程序将因为没有这些密钥而失败。最好部署可以包装现有API的其他版本的API,可以提供特定于工作流的其他功能。要了解如何执行此操作,请遵循以下link

API密钥的优点是您可以限制对API网关功能的访问,随意删除密钥,回收它们等。

认知-联合用户

您的移动用户实际上正在使用federated users进行身份验证。但是,联盟用户通道之一恰好是认知的。您可以添加更多,OpenAuth,Google,Facebook,SAML等,在这里您可以添加客户端使用的身份验证类型。然后,用户将使用其用户名和密码向客户端安全提供程序进行身份验证,然后将这些凭据通过联合用户传递给API,因此必须将联合用户设置为使用与客户端相同的身份验证机制。请参阅以下blog post

对于此解决方案,我们有多种选择。 1.将用户凭据与联盟用户一起传递到API,这假定用户界面调用了Web服务,但是正如您所提到的,它是工作流,并且我假设用户不会像使用移动应用程序那样直接访问服务。即服务由机器作为服务器上的后台进程调用。这意味着此解决方案将不起作用。选项2是为客户端隐身创建一个新用户。这与通过移动应用访问服务相同。为此,您需要在客户端上做一些额外的工作,因为您需要检索临时访问令牌。

  • 第1步。使用SDK,或自行编写API接口的代码。
  • 第2步。在Cognito中生成一个供后端系统使用的用户。
  • 第3步。使用认知用户获取访问令牌
  • 第4步。使用访问令牌访问API中的Web服务 网关。

建议的解决方案

创建第二个版本的API作为移动API的包装或扩展,并如上所述使用API​​密钥。为什么?

  1. 可以限制对API的访问
  2. 不同的版本意味着您可以对其进行扩展并添加特定于工作流程的其他功能
  3. 由于没有密钥交换,因此最容易实​​现,例如对 请求标头。

编辑:我对解决方案2的建议不正确。 AWS文档说following 要将API方法包括在使用计划中,您必须配置单个API方法以要求使用API​​密钥。为了进行用户身份验证和授权,请勿使用API​​密钥。使用IAM角色,Lambda授权者或Amazon Cognito用户池。

AWS还说controlled access可用以下内容

  • 资源策略,您可以创建基于资源的策略,以允许或拒绝从指定的源IP访问API和方法 地址或VPC端点。
  • 标准AWS IAM 角色和策略提供了灵活而强大的访问控制,这些访问控制可应用于整个API或单个API 方法。
  • 跨域资源共享(CORS)使您可以控制API如何响应跨域资源请求。
  • Lambda授权者是Lambda函数,这些函数使用承载令牌身份验证以及 标头,路径,查询字符串,阶段描述的信息 变量或上下文变量请求参数。
  • Amazon Cognito 用户池可让您创建可自定义的身份验证和授权解决方案。
  • 客户端SSL 证书可用于验证对后端系统的HTTP请求是否来自API网关。
  • 使用计划,您可以向客户提供API密钥-然后跟踪并限制每个API的API阶段和方法的使用 键。

并非所有上述方法都打算用于授权,例如,CORS实际上可以保护用户免受跨站点脚本的攻击,并且可见API密钥仅用于使用计划。资源策略通过限制对IP地址的访问来进一步保护API,因此,您唯一的选择实际上是选项1中所述的IAM角色,以及选项3中所述的联合用户,或者您自己的自定义lambda授权(如果您使用的是Lambda),或者如果您使用的不是lambda封装的API网关,则您可以自己授权。

答案 2 :(得分:0)

您可以单独使用API​​令牌进行授权(除非最近已将其删除)  我已经在多个应用程序上使用它们。 不建议在 Authentication 中使用它-但如果它们足以进行授权,则它是特定于应用程序的 通过更安全的方法对它们进行了补充,以牺牲客户端和服务器的复杂性为代价。

API令牌的优点是发行者,客户端和服务器易于使用,因为它们不需要复杂的签名或协议-但是它们在根本上不安全,因为它们可能被重用并且通常不会很快过期。否则,它们等同于承载令牌。

安全性非常依赖于上下文-考虑以下问题: 您到底要防止什么(提供安全性 for )?安全漏洞的风险和成本是多少?实施和使用它的成本/精力是多少? 许多安全性“漏洞”不在认证协议自身处理中,而是在“盒外”管理数据的方式中-没有完美的安全性,这意味着追求完美安全性的代价不菲,效率却不断降低。通常,建议平衡潜在损失的风险和成本与实施和维护的成本。 您可以拥有“高度安全”的API,但由于在通过受保护网关之前和之后进行处理,因此也存在很高的破坏和数据丢失风险。在许多合理的情况下,与其着重于使用银行保险库和装甲卡车保护“前门”,不如确保数据处理的安全性,使得没有任何重大安全风险的数据通过前门。 AWS提供了一系列技术功能-但最终要由每个客户来实现适合其使用的功能。 API密钥确实具有一系列适当的用例,尤其是在服务器到服务器的通信中,尤其是在不涉及个人身份(和PI数据)的情况下,或者在API主要涉及服务而不是数据的情况下(例如,图像缩略图API)不存储任何状态,也不提供对数据的访问权限)。当通过使用HTTPS / SSL以及可能的其他安全因素(例如帐户密码,IP范围白名单和最小访问的一般策略)进行支持时。
不要小看“粘滞音符”因素。如果您使安全访问对用户来说太痛苦了,他们会找到一种方法来减轻它的痛苦,但又使他们变得不那么安全,然后再采取更简单的措施,而这些措施就不会诱使他们规避。

相关问题