自定义授权者与Cognito - amazon api网关的身份验证 - Web应用程序

Pra*_*hat 13 authentication amazon-web-services amazon-cognito

我一直在制作一个网络应用程序.(S3上的Angular 2和通过API网关的lambda中的API).对于身份验证,我使用了cognito和自定义授权程序(我通过自定义授权程序和cognito将我的身份验证配置为与Google和Facebook bith一起使用).在自定义授权器的情况下,我通过authroization标头传递令牌,我的自定义授权器验证它.

我正在寻找有关我应该向前推进的建议,以及它们的优缺点.我能想到的是:

AWS cognito:

优点

  1. AWS SDK会为您处理所有事情,您在身份验证过程中不会犯错误.
  2. 通过IAM对AWS资源进行细粒度访问控制.
  3. 身份验证不需要每个API前面的额外lambda函数.

缺点

  1. 需要在客户端专门使用AWS SDK.程序员必须将其添加到他们的工具链中,并在开发过程中使用它.增加了额外的复杂性.
  2. 实际上并不需要对资源进行细粒度的访问控制,因为唯一的访问是API网关.

自定义授权者

优点

  1. 您可以按照自己的方式使用身份验证机制.对身份验证和授权的最终控制.
  2. 您可以让UI使用标准令牌(JWT)调用API,并且开发人员的流程保持不变.无需额外考虑AWS SDK.

缺点

  1. 身份验证需要大量的思考和努力才能构建.
  2. 缺少一些关键方面的机会总是存在.
  3. 它就像重新发明轮子一样.为什么亚马逊已经为你做了这件事.

所有这一切,我现在倾向于自定义授权.这里需要有关该主题的建议.

PS:我知道我发布的问题没有明确的答案,但对于那些试图决定其应用程序身份验证的人来说会有很大的帮助.

Pra*_*hat 7

好的,身份验证和安全性确实很难,AWS安全团队已经考虑过很多问题,您可能没有想到并实施这些问题并使您的应用程序不安全.我实现了我的自定义授权器,以期望一个授权令牌(通过授权头传递),这是一个base64编码的值,它会在会话中的所有请求中重复.事实证明,由于RC4和diffie hellman的弱点,这使得TLS容易受到攻击.如果我们只是使用IAM使用cognito,那么AWS sigv4请求签名可以保护您免受这些弱点的影响.关注https://www.youtube.com/watch?v=zmMpgbIhCpw了解更多详情.

使用cognito/IAM的另一个好处是它可以保护您免受CSRF重放攻击.请求签名涉及使用时间戳.IAM将拒绝超过约5分钟前签署的任何请求.

简而言之,如果可以的话,请避免使用自定义授权器,并将IAM与cognito一起使用.你会感谢你自己.


Yve*_* M. 5

这是一个简短的答案,但是,为什么不同时使用它们呢?

使用实际实现的自定义授权方以使用 Cognito 用户池和 Cognito 联合身份。

当您使用 Cognito 时,您可以选择不使用所有内容。

例如,我设置了一个自定义授权器,而我的 Lambda 实际上使用 Cognito 用户池 API 来验证用户。我让 Cognito 用户池处理所有密码、令牌等。

  • 您现在可以同时使用两者,使用 cognito pre-auth 挂钩作为您的自定义授权方 https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-lambda-pre-authentication.html (3认同)
  • Cognito 现在已与 Amazon API Gateway 集成。您可以在不编写自定义授权方的情况下使用 Cognito 用户池。 (2认同)