You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何导出Gun用户认证凭证实现跨设备跨会话登录

Gun 用户凭证导出与跨设备认证方案

1. 凭证导出方法(类JWK格式)

  • 不需要单独提取salt值,也不要尝试访问create原型中的act对象:act是创建用户流程里的闭包临时变量,没有稳定的对外暴露接口,不同版本结构差异极大,强依赖会导致兼容问题;salt本身是密码派生环节的参数,和加密后的私钥一同存储在用户的公开图数据中,在明文密钥导出场景下完全不需要单独提取。
  • 你在完成auth后拿到的user._.sea就是完整的密钥对对象,包含pub/priv/epub/epriv所有跨设备认证必需的字段,直接序列化就能生成可保存的类JWK凭证,示例代码:
// 已登录状态下导出凭证
function exportJWKLike() {
  const fullKeyPair = user._.sea;
  // 组装类JWK结构,可按需添加自定义元数据
  const credential = {
    kty: "gun-SEA",
    uid: user._.get,
    exportTime: Date.now(),
    keys: fullKeyPair
  };
  // 转成可复制保存的Base64字符串
  return btoa(JSON.stringify(credential));
}

重要提示:导出的凭证等价于账号所有权凭证,不需要密码就能登录,必须提醒用户妥善加密保存,禁止明文传输或泄露。


2. 新会话导入认证相关函数

跨设备导入凭证最直接的方式是使用user.auth()的密钥对入参重载,不需要走用户名密码、salt校验的流程,Gun内部会自动完成签名校验和会话初始化,示例代码:

// 导入保存的凭证完成认证
function importCredential(credentialStr) {
  const credential = JSON.parse(atob(credentialStr));
  const keyPair = credential.keys;
  // 直接传入密钥对即可完成认证,无需额外参数
  user.auth(keyPair, (res) => {
    console.log("认证结果:", res);
  });
}

其他相关可用函数说明:

  • 如果是走「用户名+密码」的常规登录流程,不需要手动处理导入,直接调用user.auth(username, password, cb)即可,Gun会自动从节点拉取对应salt和加密私钥,本地完成解密认证,不需要你手动传salt。
  • 如果需要自定义密码加密导出的凭证,可以搭配SEA.encrypt/SEA.decrypt对导出的密钥对做二次加密,进一步提升凭证存储的安全性。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:18:21