游戏登录鉴权的信任链:三个阶段(大白话版)
发布时间:2026/8/21 21:33:09 作者:尧图编辑部 阅读量:1,286
)
接着前面登录鉴权那两篇聊。有人问信任链是啥。这词其实是把前面讲的东西换个角度重新看——服务器凭什么信你这份信任是怎么一步步建立、传递、反复确认的还是用那个健身房的比喻一路讲到底。先搞懂信任链这个说法服务器默认谁都不信。你一个陌生请求发过来凭什么给你数据所以你得证明自己。但证明这件事不是一次搞定就完了它是一条链子环环相扣第一次证明 → 换一个信任凭证 → 之后每次都验这个凭证 建立 传递 验证一环扣一环任何一环断了整条信任就崩了。这就叫信任链。对应三个阶段阶段一建立信任 → 你第一次证明我真是张三 阶段二传递信任 → 服务器给你发张卡信任变成能带走的东西 阶段三验证信任 → 之后每次刷卡反复确认这卡是真的下面一个个说。阶段一建立信任从零开始证明你是你这是信任链的起点也是最较真的一步。因为这时候服务器完全不认识你你得拿出真凭实据。回到健身房你第一次去前台不认识你要你出示身份证核对。这就是建立信任——用一个只有你本人才有的东西来证明身份。游戏里这个只有你本人才有的东西通常是账号 密码 → 只有你知道密码 微信/苹果一键登录 → 只有你的微信能授权 短信验证码 → 只有你的手机能收到以账号密码为例服务器这时候干的事就是前面讲过的核对密码// 阶段一建立信任 —— 核对身份var用户await_userRepo.GetByAccount(请求.账号);if(用户null)returnUnauthorized(账号或密码错误);// 拿玩家输的密码跟数据库存的指纹比对if(!验证密码(请求.密码,用户.密码乱码))returnUnauthorized(账号或密码错误);// 走到这说明你真是张三这件事服务器信了这一步的特点最重、最慢、最谨慎。为什么慢因为验密码要反复搅拌10万次前面讲过故意拖慢防暴力破解。为什么谨慎因为这是唯一一次用真凭实据证明身份的机会后面全靠它撑着。关键点这一步是整条链的地基。地基这里要是被攻破比如密码被盗后面所有环节都白搭。所以现在很多游戏在这一步加码——加验证码、加二次验证手机验证码、加设备指纹就是想把这个地基砌得更牢。阶段二传递信任把信任变成能带走的凭证身份证明完了问题来了总不能你每点一下屏幕都重新输一遍账号密码吧太麻烦而且密码到处传太危险。所以健身房的做法是核对完身份证给你一张会员卡。之后你就不用带身份证了刷卡就行。游戏里这张会员卡就是令牌Token。服务器把我已经信任张三了这件事打包成一张卡发给你。// 阶段二传递信任 —— 发令牌// 把信任张三这件事变成一张能带走的卡string访问令牌发令牌(用户.Id,用户.账号);// 短命的2小时string刷新令牌发刷新令牌(用户.Id);// 长命的30天用来续卡returnOk(new{访问令牌,刷新令牌});这一步的核心是信任的形态变了阶段一信任 你知道密码一个秘密 ↓ 转换 阶段二信任 你手里有张盖了防伪章的卡一个凭证从知道一个秘密变成持有一个凭证。这个转换特别关键因为密码不能到处传但令牌可以它就是设计来到处传的密码泄露是灾难令牌泄露顶多2小时后作废所以设短命这张卡自己带着防伪章前面讲的JWT签名别人伪造不了为什么这一步叫传递因为信任从服务器传递到了玩家手上变成了玩家能拿着走的东西。之后玩家拿着这张卡就等于随身带着服务器对他的信任。阶段三验证信任之后每一次都要确认发了卡不等于就放心了。玩家之后每次刷卡——进游戏、买道具、传战绩——服务器都得验一下这张卡是不是真的。健身房里你每次刷卡进门闸机都要滴一声验一下卡。不是说办了卡就随便进每次都要验。游戏里也一样每个请求都要过验令牌这道关// 阶段三验证信任 —— 每次请求都验卡publicasyncTaskInvoke(HttpContext 请求){// 从请求里掏出令牌string令牌拿到令牌(请求);// 验防伪章对吗没过期吧是我发的吗var玩家验令牌(令牌);if(玩家null){// 卡是假的、或过期了、或被改过 —— 信任断裂踢回登录请求.Response.StatusCode401;await请求.Response.WriteAsync(登录失效重新登录);return;}// 卡是真的信任确认放行请求.User玩家;await_next(请求);}这一步的特点最频繁、最快。跟阶段一正好相反。阶段一一次登录只发生一次慢点无所谓。阶段三是每个请求都要跑一遍一秒钟可能几万次所以必须快。这也是为什么用JWT——验它的时候不用查数据库光靠那个防伪章服务器自己就能验真假。要是每次请求都去查一次数据库服务器早被压垮了。三个阶段串起来看把整条信任链拉通就是这么个流程阶段一【建立】 玩家我是张三密码123 服务器核对……对我信你了 慢、重、一次性、最谨慎 ↓ 阶段二【传递】 服务器给你张卡令牌带着防伪章 玩家收好揣兜里 信任从秘密变成凭证 ↓ 阶段三【验证】 玩家进游戏出示卡 服务器验章……真的进 玩家买道具出示卡 服务器验章……真的买 玩家传战绩出示卡 服务器验章……真的传 快、频繁、反复确认用一句话概括三个阶段的关系阶段一费大力气确认你是你一次阶段二把这份确认打包成一张卡交给你阶段三之后每次只需飞快地验这张卡不用再重新确认你是谁。这就是把证明身份这件昂贵的事只做一次然后用一张卡低成本地重复利用无数次。信任链的精髓就在这。那条续卡的链是怎么回事有人可能想到卡2小时就过期过期后玩家又得重走阶段一输密码那不还是麻烦这就是前面讲的刷新令牌在发挥作用了。它相当于在信任链上又接了一环访问令牌过期了 ↓ 玩家拿刷新令牌那张30天的长命卡去服务器 ↓ 服务器这张长命卡有效 → 直接发张新的访问令牌 ↓ 玩家无感续期继续玩不用重输密码所以完整的信任链其实能自我延续只要那张30天的刷新令牌还在信任就能一直续下去玩家一个月都不用重新登录。等刷新令牌也过期了才需要回到阶段一重新输密码建立信任。每一环断了会怎样理解信任链最好的方式是看哪一环断了会出什么事阶段一被攻破密码被盗 → 灾难。攻击者能直接登录走完整条链冒充你为所欲为 → 所以要加验证码、二次验证死守这一关 阶段二出问题令牌发放/私钥泄露 → 灾难。私钥漏了攻击者能自己伪造卡跳过阶段一 → 所以私钥要藏死绝不能进代码和git 阶段三出问题验证逻辑有漏洞 → 灾难。比如忘了验过期、忘了验防伪章假卡也能进 → 所以验证规则一项都不能漏三环环环相扣只要有一环松了整条信任链就形同虚设。安全这东西是按最短的那块木板算的。和防沉迷、成年判断怎么接顺便接回前面的话题。这条信任链走完玩家的身份就确定了。之后阶段二发卡时我会把NPPA的实名标识pi、是否成年一起塞进令牌阶段三验卡时顺手就把这些信息读出来了// 发卡时塞进去newClaim(pi,用户.实名标识),newClaim(isAdult,用户.是否成年.ToString())这样未成年人的宵禁、限时长逻辑直接搭在阶段三上——每次验卡的时候顺便判断这人成年没、现在能不能玩不用额外查库。信任链和防沉迷就这么无缝拼在一起了。再总结一次三个阶段记这三个词就够建立费力证明你是你→传递换成一张卡→验证之后反复刷卡本质就一句话身份只认真核对一次之后靠一张信得过的卡反复走天下。哪个阶段还想细挖评论区见。