我的 OAuth2 认证流程图,实际上更像是一张蜿蜒曲折的地图,而不是教科书里那个标着红线的标准答案。
看看这张图(我在心里默默画了个示意图),我们不用那些虚头巴脑的术语,直接盯着流程里那几个关键角色在干啥。Alice 想买东西,她不是直接掏钱,而是先把自己收藏的“身份证明”借给 Token Server。
这一步得略微解释清楚:她手里有个 App ID,那是她的身份证,而那个 Server 有数据库,那是她的房产证。她把这个身份证借给 Server 看,Server 检查身份证有没有过期、有没有被保修。
要是一切正常,Server 就把 App ID 发给 Alice。Alice 拿到这个 App ID,再拿着它去找 Server 自己的那本房产证(App Secret)。
这里有个细节,Server 每次都要核对 App Secret,防止有人拿别人的身份证去冒充自己。Bob 是另一个用户,他连 App ID 都没拿到,他只能把 App Secret 发给 Server。Server 再次核对,确认 Bob 的身份证和房产证信息都对,便 Bob 收到了自己的 App ID。 接下来是授权请求。Alice 拿着 App ID,跑去找 Server。她不是直接说“我想买东西”,而是说“我想把我的 App ID(身份证)借给 Server 用,但我要先签个字(应允协议)”。她发的是 Authorization Request。Server 收到之后,先看 Alice 有没有在 App Secret 里留下那个 App ID,是的话就持续,是不是的话就弹窗问:你应允吗?Alice 点应允。
这时候,Server 做了一件事:把 Alice 的 App ID 和 App Secret 配对好了,嵌到了一个特别短小的字符串——那个就是 Access Token。
这个 Access Token 就是激光笔,手里拿着它,Alice 就能进门了。 Bob 这边呢,情况略微费事点。他手里也没有 App ID,只有 App Secret。他直接跟 Server 说:“我想用我的 App Secret(房产证)去借身份证(App ID)。”Server 收到后,查它数据库,发现 App Secret 里确实留着那个 App ID,便又生成一个新的 Access Token 发给 Bob。
这就是双向验证的逻辑,一个借一个的,别看看起来有点绕,但保险性那是没说的。 最终,Alice 手里拿着 Access Token,跑去个叫“回调地址”的地方。
这是那个 Server 专门给自己留的后门。Alice 把 Token 一投进去。Server 把 Access Token 和刚刚那个 App ID 拿出来,仔细比对一下。发现 Contain 了?好,证明是 Alice 自己的 ID。Server 就把这个 ID 发给 Alice。Alice 收到后,心里咯噔一下:“哦!我刚刚借的身份证,目前确实是我自己的。系统没骗我。”这时候,Bob 那边也收到了自己的 ID,他也认定自己“被借”了。 为了讲清楚这个“借身份证”的过程,我特意加了一组数据。假设 Alice 的 App ID 是 "10086"(就像手机号一样),App Secret 是 "1234"。Server 的数据库里,Alice 的身份证记录里,App ID 字段填的是 "10086",App Secret 字段填的是 "1234"。Bob 的记录里,App ID 也是 "10086",但 App Secret 是 "12345"。 当 Bob 拿着 "12345" 去找 Server 借身份证时,Server 的数据库显示 Bob 的 App Secret 是 "12345",跟 Bob 供给的 "12345" 彻底匹配。Server 生成新 ID 发给 Bob。当 Alice 拿着 "10086" 去找 Server,这次她供给了对的 "1234",Server 查遍数据库,发现 Alice 的 App ID 确实是 "10086",便把 ID 还给了 Alice。 这里有个坑,大量人会混淆。Alice 供给的是 App ID,Bob 供给的是 App Secret。
要是 Alice 供给了 App Secret 去找 Server,Server 会查它的身份证数据库,发现 App Secret 一般是不公开的,查不到,这时候 Alice 就得去查服务器自己的数据库,看那个 App Secret 是不是确实存有。
这就是为啥 OAuth2 像一个严格的证人证言程序,身份验证务必严谨,不能随意乱认人。 整个流程实际上就是一场关于“身份”的谈判。Alice 想使用服务,她务必出示 App ID,但 App ID 不能直接被用,务必经过 Server 的权限检查。Bob 同理。Server 扮演着警察的角色,它手里有密码(App Secret),能认出哪位是真证人(通过 App ID 匹配),而真正的持有者(App ID 持有者)只能拿到临时通过的通行证(Access Token),不能把通行证到处扔,不然下次进来了就是别人了。 最终,Alice 拿着通行证,去服务器指定的地方(回调地址)交账。Server 核对通行证上的 ID,确认无误,便正式承认 Alice 的访问权限。整个过程别看有点繁琐,层级不深,但每一步都有数据支撑,每一步都在防止冒名顶替。
这就是 OAuth2 认证的核心,好办直接,全靠数据对得上,哪位也不赖账。