用例: 我们有一些AWSGateway API,我们的客户可以使用它们在后端做一些事情。这些API受Cognito保护。目前,我们的客户正在通过使用Cognito Mobile SDK构建的android应用程序使用此APIS。
现在,我们正在尝试向客户公开这些API,以将其集成到其内部工作流程中。
我试图找到最好的方法。目前,我找不到任何有关执行此操作的资源。
我似乎是AWS Cognito的服务器端用户,但我认为这不是我们要在这里做的事情。
谢谢。
答案 0 :(得分:0)
我想这将是服务到服务或(服务器到服务器)通信,因为使用的该术语是Oauth Standard是client_credentials
授予类型。
请参阅文档以获取token
获取令牌后,您需要传递此令牌Authorization
或API Gateway Custom Header for AWS Cognito
。
答案 1 :(得分:0)
要正确回答您的问题,我们需要更多信息。
SDK或没有SDK
您可以通过生成的SDK或您自己的代码访问API Gateway中的Web服务。 在here中找到了从API网关控制台生成SDK的说明。
要通过身份验证调用Web服务,可以通过IAM,API密钥,Cognito,自定义授权者四种方式来完成。我要提到前三个。
IAM
示例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。
API密钥
如果您将密钥添加到您的API,则移动应用程序将因为没有这些密钥而失败。最好部署可以包装现有API的其他版本的API,可以提供特定于工作流的其他功能。要了解如何执行此操作,请遵循以下link。
API密钥的优点是您可以限制对API网关功能的访问,随意删除密钥,回收它们等。
认知-联合用户
您的移动用户实际上正在使用federated users进行身份验证。但是,联盟用户通道之一恰好是认知的。您可以添加更多,OpenAuth,Google,Facebook,SAML等,在这里您可以添加客户端使用的身份验证类型。然后,用户将使用其用户名和密码向客户端安全提供程序进行身份验证,然后将这些凭据通过联合用户传递给API,因此必须将联合用户设置为使用与客户端相同的身份验证机制。请参阅以下blog post
对于此解决方案,我们有多种选择。 1.将用户凭据与联盟用户一起传递到API,这假定用户界面调用了Web服务,但是正如您所提到的,它是工作流,并且我假设用户不会像使用移动应用程序那样直接访问服务。即服务由机器作为服务器上的后台进程调用。这意味着此解决方案将不起作用。选项2是为客户端隐身创建一个新用户。这与通过移动应用访问服务相同。为此,您需要在客户端上做一些额外的工作,因为您需要检索临时访问令牌。
建议的解决方案
创建第二个版本的API作为移动API的包装或扩展,并如上所述使用API密钥。为什么?
编辑:我对解决方案2的建议不正确。 AWS文档说following 要将API方法包括在使用计划中,您必须配置单个API方法以要求使用API密钥。为了进行用户身份验证和授权,请勿使用API密钥。使用IAM角色,Lambda授权者或Amazon Cognito用户池。
AWS还说controlled access可用以下内容
并非所有上述方法都打算用于授权,例如,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范围白名单和最小访问的一般策略)进行支持时。
不要小看“粘滞音符”因素。如果您使安全访问对用户来说太痛苦了,他们会找到一种方法来减轻它的痛苦,但又使他们变得不那么安全,然后再采取更简单的措施,而这些措施就不会诱使他们规避。