我用过 AWS Cognito,再也不会了
I Used AWS Cognito for a Startup. I Wouldn't Do It Again

创业初期,团队因为“生态集成”和免费额度选择了 AWS Cognito,结果我却陷入了文档混乱、API 频繁重构和本地开发受阻的泥潭。Amplify v6 的升级直接让原有代码失效,而 Cognito 的属性配置一旦设错便无法修改,只能重建整个用户池。从文档像“搅拌机”一样拼凑,到本地无法离线测试,再到自定义 UI 的局限,这段经历让我深刻意识到:认证系统绝不能为了生态便利而牺牲开发者体验。那些在调试中浪费的工程时间,足以支付多年付费服务的费用。如果你正在评估 Cognito,请先构建一个包含自定义属性和密码重置流程的原型,看看自己需要打开多少个文档标签页。
这不是升级,这是一场绑架。
HN 评论区
117- wilkystyle
读 Cognito 的文档,感觉就像有人把三本不同的手册扔进搅拌机,然后又撒了一些过时的 Stack Overflow 答案来调味。
这基本上是我对 AWS 所有文档的体验。它们要么(1)过于宏观,毫无实际用处;要么(2)过于冗长,充斥着大量我需要解析并丢弃的冗余信息,才能找到我想弄清楚的内容。
仅举一例,我最近需要将 AWS Partner Central 账户与 AWS 管理账户关联起来,其流程和文档都复杂得令人痛苦:https://docs.aws.amazon.com/partner-central/latest/getting-s...
- solatic
下次,我会优先基于开发者体验来选择工具,而不是 AWS 服务集成的便利性。我们花在调试 Cognito 问题上的时间,本可以支付好几年的付费认证服务商费用。
有多少付费认证服务商允许你导出用户密码哈希,以便在你需要时能无缝迁移到另一家供应商?
认证问题的核心在于:(a)登录界面是向未认证用户展示的,这是一个包含攻击者的超集,他们会从 DDoS 到精心构造的恶意输入无所不用其极,试图窃取用户机密,因此你确实需要选择那些已经在大规模生产环境中运行并积累了所有实战经验的产品;以及(b)选择托管供应商的需求与本地开发、供应商独立性、数据可移植性以及其他“良好工程实践(TM)”之间存在极大的张力。
没错,AWS Cognito 很烂。在很多方面,这款产品感觉停滞不前。为了把东西做出来、跑起来并稳定下来而做出的妥协很糟糕。但老实说,除非你愿意为了(b)而牺牲(a)(在某些情况下确实如此,特别是针对防火墙后、不太容易受到此类攻击的内网应用),并选择像 Keycloak 这样的方案,否则 Cognito 其实算不上最坏的选择(想到 Okta 就让人不寒而栗)。
- patwolf
我对 Cognito 的体验与作者完全一致。我过去主要使用 Auth0,但为了一个新项目我们转到了 Cognito,因为它更便宜。
我不喜欢邮箱地址区分大小写,现在你想改这个?抱歉,你得从头创建一个新用户池——无法迁移。
- mannyv
我记得曾和 Cognito 团队讨论过密码重置功能,并争辩说“能够设置密码”是一个必备功能。他们的反应是:“不,为什么你永远不会不走重置流程?这是个安全问题。”结果当然,几周后他们还是加上了这个功能,因为每个管理员都需要这么做。所以在某个阶段,他们有一堆人在做这个项目,却几乎没有任何运维经验。
Cognito 有两个好处:(1)它允许你在没有任何本地凭证的情况下登录服务;(2)Cognito 身份允许你访问 AWS 资源。你现在可能也能做到这一点,但很多解决方案仍然需要设备上的密钥……这显然是一个安全问题。
此外,使用自己的后端进行认证让管理变得更容易,因为你的认证逻辑没有被困在 Cognito 里。
- cldcntrl
Cognito 确实有很多粗糙的边缘,这篇文章并没有真正提到其中任何一点。
如果你曾尝试通过 Cognito 实现一个可用的 SAML 集成,你就会知道这个流程有多晦涩。我曾不得不与 Cognito 团队合作,修复了一些真正致命的 bug。
这肯定不是 AWS 最精致的服务,但如果你熟悉其内部运作,还是可用的。
- mikigraf
别让我开始谈备份或其他这类服务本该具备的基本功能。AWS 要么收购一家公司(比如 Auth0 或像 Wristband 这样的小公司)并重建该服务,要么就直接把它砍掉。结果呢,我们有一个企业依赖的关键服务却陷入了停滞不前的状态……
- dabinat
就我个人而言,我绝不会将业务建立在与特定供应商绑定的技术上,如果该供应商服务糟糕或大幅涨价,切换起来会非常困难。
- nater5000
我并不否认 AWS Cognito 不是最容易上手的认证服务,但一旦你搞懂了,它的表现和其他服务一样好。
我经历过作者描述的完全相同的痛苦(甚至更多)。但关键在于,一旦你经历过这些痛苦,你就知道如何应对了。在软件领域,你只需要搞懂一次,然后事情就解决了。
我不能说我把 Cognito 用到了超大规模,但我可以说,在 AWS 内部保持所有东西(视具体情境而定)是值得折腾的。Cognito 提供了大量真正的自定义选项(托管 UI 仅适用于初始测试,之后就可以扔掉了)。当然,LLM 处理 Cognito 也和处理任何其他认证服务一样轻松。我在设置 Cognito 时没有使用 LLM 的便利,但它仍然是我首选的认证方案,而 Claude 在处理它时也不会卡壳。