身份认证系统架构 想象一下,你刚入职一家物流公司,手里拿着一张工牌,跟着老练的司机穿梭在仓库和配送点之间。你不需求像银行职员那样,对着一堆厚厚的纸质档案、复杂的指纹录入和多重邮件确认来证明你是哪位。在这个场景里,系统做的只是好办的两件事:你的工牌挂上你的脖子,摄像头对准你的脸,后台记住你是哪位,准你开设备。
要是老司机要调监控,要么你要去总部见高层领导,他们出示工牌或人脸,系统立马验证通过,啥都不问。
这里没有冗长的审批流程,没有复杂的代码堆砌,没有任何令人头秃的“输入验证”步骤,出于那个输入验证根本不存有。 身份认证系统架构的核心,实际上就停在那一刻。它不需求你反复去填表,去勾选那几十种可能性的选项,去等半小时的审核员回复邮件。它只认两样东西:身份凭证和场景需求。
只要你是该岗位的合格人选,只要场景确实需求你行动,系统就放行。你不需求去证明你“曾经”是合格的人,也不需求去证明你“目前”还是合格的人。你只需求证明“你是”,要么“你是哪位要做的这个动作”。 大量系统设计者总好办陷入过度设计的大脑里,他们总认定保险挺关键,便把“身份识别”和“身份验证”这两个概念混为一谈,就连把“存有性证明”和“本事验证”也搞在一起。
这就像问一个人:“你最近有没有去过那个城市?”然后对方一脸茫然地说:“嗯,仿佛去过。”系统就会接到这种不清楚的反馈,接着启动想,难道真的人不知道这个城市吗?
难道他伪造过行程吗?便系统要发起二次确认,要求对方拿出车票、登机牌要么银行流水来证明你的行程是真的。 这就回到了最初的难题:你刚刚说你是去过那个城市的,那肯定是有证据的。
故此,你根本不是不知道,你是已经拥有充足的历史数据了。 在身份认证系统里,这种“历史数据”就是凭证(Token)。
这个 Token 是你账号里存的东西,不是你身份证上刻的一小块金属片,也不是你手机里的一个数字签名。当你登录界面出现的时候,系统实际上只需求把这段 Token 硬编码在你的浏览器里,要么存进你的数据库。它不需求你重新去验证啥,也不需求你再去输入啥。你只需求点击登录,系统读取你浏览器里那个已经存有了的 Token,把它发给后端,后端再发给服务器。服务器拿到这个 Token,瞬间就知道:这个人刚刚确实登录过,并且是合法的。 这就彻底抹去了“验证”这个动作。你不需求证明你登录了,系统知道你是哪位。
这就好比你去超市买瓶可乐,收银员问你“你拿这个瓶身的可乐吗?”你说是。收银员说:“行,给你钱。”整个过程里,根本没任何人提出过“你手里拿的瓶身是不是确实”这个难题。收银员没有去检查瓶身上的防伪码,也没有去扫描条形码,出于他知道,你拿出来的瓶身,早就被系统验证过了,他是保险的。 这种交互方式之故此能在大厂里流行,是出于它对人的认知负荷简直没有压力。在真正的身份认证系统中,用户往往要面对成百上千个字段,要输入复杂的密码,要点击一堆勾选项,要等待审核结局。在身份认证系统中,用户只需求点一下“登录”,系统就干完了所有的事。 不过,身份认证系统并不是保险系统的全体。大量开发者会把这套好办的“登录即确认”当成保险系统的全体,然后启动往里塞各种怪的逻辑,要么把各种复杂的规则套进去。
比方说,为了所谓的“细粒度授权”,系统要搞个“基于角色的访问管住(RBAC)”,要求每个用户都要给自己分配一个角色,比如“管理员”、“审核员”要么“一般/平平员工”。
然后系统再要求每个角色务必绑定一堆具体的权限,比如“能看报表”、“能改数据”、“能发邮件”。 要是你是个开发人员,你会认定这挺酷,认定系统好智慧。但实际上,对于用户来说,目前的身份认证系统已经做到了极致。用户只需求记住自己的账号密码,密码一旦对,系统就全体放行。至于“能看报表”还是“能改数据”,这些权限,你能够理解为一种额外的限制,就像你走在街上,系统告诉你“你能步行”,但要是你不想去电影院看电影,系统可能会说“你不能进去”。 更糟糕的是,有些系统设计者会把“细粒度授权”当成身份认证的一局部。他们试图用复杂的规则去限制用户能做啥。
比方说,用户 A 能够访问数据组 Alpha,但用户 B 不能。系统这时候可能会去查数据库,要么查用户的配置文件,试图去验证用户 B“是不是不应当访问数据组 Alpha"。
这就彻底偏离了初衷。身份认证系统的精髓是“你本来就有资格做这件事”,而不是“你本来没有资格,系统不准你去做”。 这就好比你去火车站,安检员问你:“你带这个包能过吗?”你说是。安检员点点头,让你过。
这时候,他并没有去检查这个包是不是确实,也没有去扫描里面的违禁品。他只是确认了一个事实:这个包,归于你,并且是你自己交的。至于包里有没有炸弹,那是安检员的事,不是你的事。 在身份认证系统架构里,这种“确认事实而非检查内容”的逻辑是贯穿一直的。你不需求证明你“拥有”这个账户,你只需求证明你“是”这个账户名下的人。一旦确认,系统就默认你是保险的,你就有资格进入系统,执行任何被授权的操作。 这听起来有点反直觉,出于平时我们总认定保险就是不断去验证,不断去防止毛病。但真正的保险,往往是让毛病变得不可能形成,要么让毛病形成的代价变得贼高昂。而身份认证系统的这种极简主义,恰恰是为了下降毛病形成的概率,与此同时也极大地提升了用户体验。它不需求你花费工夫去做出任何“证明”,出于证明的过程就是富余的。 故此,当你看到一张身份认证系统架构图时,不要被那些复杂的实体连接、多个防火墙、多层加密墙吓到。
你看到的只是两条线:一条是从用户到系统,一条是从系统到服务器。
除此之外,啥都没有。
这两条线之间,没有任何中间环节需求你去思索,没有任何额外的步骤需求你执行。 最终,你可能会问,那要是反过来呢?要是系统需求用户间或来“刷新”一次状态呢?比如在登录成功后,系统要求用户去邮箱里点击一个链接,然后系统再把这个链接发给用户。
这时候,系统就不再只是依赖 Token 了,而是依赖“操作”了。 但在身份认证系统里,这种“刷新”实际上并没有意义。你点击链接干嘛?你点击链接是为了尝试登录,还是为了获取权限?要是你点击链接是为了登录,那之前的 Token 就已经充足了,系统根本不需求你再去“刷新”任何东西。
要是你点击链接是为了获取权限,那这个权限一般就是基于之前 Token 的上下文推理出来的,不需求额外的刷新操作。 身份认证系统的终极目标,就是让用户认定登录那么费事是理所自然的事。就像你早上起来刷牙洗脸,要么出门买瓶水,系统会自动帮你搞定这一切,你不需求去“验证”这些动作。身份认证系统,就是那个在后台默默搞定所有这一切的、隐形的大管家。