游客发表
Token不是凭空造出来的东西,它本质上是一串符合特定规则的字符串。你想搭一个Token,第一步得先搞清楚你要它干什么——是用于API鉴权、区块链资产,还是登录凭证。目的不同,搭建方式完全不一样。
拿最常见的API Token来说。你登录某个平台,后台生成一串随机字符,比如eyJhbGciOiJIUzI1NiIs...这种JWT格式,或者干脆就是sk-开头的长串。服务端存一份,客户端每次请求带上它。这时候“搭建”其实分两块:生成规则和验证逻辑。
生成规则别自己瞎编。用现成的库,比如Python的secrets.token_urlsafe(32),一行代码出来43个字符,熵够高,不容易被猜到。Node.js里用crypto.randomBytes(32).toString('hex')也行。千万别用Math.random()或者时间戳拼一拼,那种Token跟纸糊的没区别。
如果你要的是JWT,那结构就固定了:Header、Payload、Signature三段,用点号隔开。Header写明算法,Payload放用户ID、过期时间这些,Signature用密钥签一下。搭建的时候注意,密钥别硬编码在代码里,放环境变量。过期时间设短点,半小时到两小时,配合refresh token用。
区块链上的Token又是另一回事。以太坊上发ERC-20 Token,你不需要从零写合约。OpenZeppelin有一套现成的模板,继承ERC20合约,构造函数里填名字、符号、小数位。部署到测试网,花点测试ETH,几分钟就搞定。我去年帮朋友发过一个,总供应量设了10亿,结果他忘了加销毁函数,现在那币还在链上躺着,没人动。
登录凭证类的Token,比如OAuth 2.0里的access token,搭建重点在授权服务器。你可以用Keycloak、Auth0这些现成服务,也可以自己写。自己写的话,核心是/token端点:验证客户端ID和密钥,检查授权码,生成Token,存到数据库或Redis,返回JSON。注意加限流,不然被人刷接口刷到哭。
存储环节经常被忽略。Token生成后放哪?内存里最简单,重启就丢,适合开发阶段。生产环境用Redis,设个TTL,自动过期。别用文件存,并发一上来就锁死。数据库也行,但每次请求查库太慢,加缓存层。
验证逻辑要写严。检查签名、检查过期时间、检查颁发者、检查受众。少查一项,就可能被重放攻击。我见过一个项目,Token过期时间设了十年,签名算法用的none,等于大门敞开。后来被人扫到,数据库拖走一半。
刷新机制也得搭。Access Token短命,Refresh Token长命但只能用来换新Token。Refresh Token存数据库,用一次换一次,旧的立即失效。这样即使泄露,攻击者也只能用一次。
最后说个坑:别在Token里放敏感信息。JWT的Payload只是Base64编码,不是加密。任何人拿到都能解开看。用户密码、手机号、身份证号,统统不要放。放个用户ID就够了,其他信息查库去。
搭Token不难,难的是搭得安全。随机性够不够、过期策略合不合理、存储有没有漏洞、验证严不严——每个环节都得盯住。花半小时写完的Token系统,可能花三天都补不完漏洞。
友情链接