Tronweb客户端钱包登录场景下免二次认证及接口鉴权方案咨询
基于钱包签名的无密码统一认证方案
该方案完全复用现有Tron钱包授权流程,无需额外开发独立密码体系,用户仅需一次操作即可同时完成钱包连接和应用身份认证,从根本上解决二次认证的体验问题,具体实现逻辑如下:
1. 完整认证流程
- 前端用户触发登录操作时,首先通过
tronLink.requestAccounts()获取用户授权的钱包地址,同时向后端请求一次性挑战字符串(nonce) - 后端生成与该钱包地址绑定、带5分钟有效期的随机nonce,存入缓存后返回给前端,注意nonce必须为一次性,使用后立即销毁避免重放攻击
- 前端拿到nonce后调用
tronWeb.trx.sign(nonce)唤起Tronlink签名弹窗,该操作就是用户原有钱包认证的必要步骤,无额外操作成本 - 前端将签名结果、钱包地址一并提交到后端认证接口
- 后端先校验nonce的有效性、绑定关系和有效期,再通过Tron公开验签逻辑验证签名真实性,确认用户持有对应钱包私钥后,签发JWT/会话凭证返回给前端
- 后续所有需要授权的接口请求,前端携带该JWT在请求头中即可,后端直接校验JWT有效性完成身份判断,无需重复走签名流程
2. 配套业务逻辑适配
- 用户自定义昵称等信息直接和钱包地址绑定存储在自有数据库即可,后端校验JWT通过后,可直接根据JWT中携带的钱包地址查询对应信息返回
- 若涉及修改敏感信息、资产操作等高风险接口,可针对单次请求再要求用户做一次操作内容的签名,流程和登录一致,无需输入密码
3. 验签代码示例(Node.js环境)
// 后端初始化tronweb实例后调用验签方法 const isSignatureValid = await tronWeb.trx.verifyMessage( cachedNonce, // 缓存中存储的对应地址的一次性挑战字符串 uploadSignature, // 前端上传的签名结果 uploadAddress // 前端上传的钱包地址 ); if (isSignatureValid) { // 验签通过,生成并返回JWT凭证 }
内容的提问来源于stack exchange,提问作者Trace
相关产品推荐
相关产品推荐

