全部文档/用 Beagle 登录
身份与服务

用 Beagle 登录

让用户证明自己是谁,而不必把密码或密钥交给你;同时留下一份诚实的记录:谁来过、怎么来的、做了什么。

2026 年 9 月

身份本该像现实生活一样运作

用户在网络上的行为和足迹,应该像现实生活一样:有据可查,有信可查。你走进一家店,店主看得见你来了、怎么来的、待了多久——但他拿不走你的钥匙,也要不到你的密码。

这才是改变社交软件和平台生态的必有之路,更接近生活,而不是一个把身份吞掉的孤岛。Decent Network 应有的样子,是各有各的角色、各有各的身份,而不是某一个 App 独占登录。

角色拿什么不拿什么
用户自己的密钥、自己的名字、自己的足迹不把密码交给网站
Beagle 客户端(网页 / CLI / iOS / Android)帮用户签名、出示身份不替所有服务保管用户的会话
服务方(开会、交易、商店……)核验签名,记下谁来过、怎么来、做了什么不拿用户的私钥和密码
网络(Carrier / userid / ENS)把身份与可联络地址公开到用户愿意公开的程度不当成某一个 App 的账号库

身份不归自己所有时做不到、归自己所有后就能做到的四件事:

  • 认识自己的用户 —— 他们从哪条路来、叫什么、怎么联系、参加过哪场会。
  • 可以给奖励 —— 没有出席和贡献的记录,就发不出积分、代币或席位。
  • 也可以拒绝服务 —— 这是店主决定为谁开门,不是平台没收钥匙。
  • 设定接收用户的条件 —— 指定地域、持有某种代币、持有某个 NFT。条件写在你这边,核验用的是用户出示的身份。

Beagle Meet 已经是这样一个跑在线上的案例:开会的人不把钥匙交给会议室,会议室记下签到与出席,主持人可以奖励、可以拒绝、可以加门槛。把这套做法带到你的服务里——我们一起改。

服务方应该记录什么 —— 线上真实案例

Beagle Meet 不存私钥、不存助记词、不存密码。它存的是一个人使用这项服务时出示的样子,以及在这里做过的事。正是这份记录,才使奖励和拒绝成为可能。

记录存了什么主办方为什么需要它
profilesuserid、名字、头像、Carrier 地址、从哪条路来、首次与最近出现时间他是谁,以及怎么找到他
profile_history名字 / 头像 / Carrier 变更前的值足迹 —— 这个人一路是怎么呈现自己的
auth_events每次登录的时间、来源、客户端、平台、origin他走的是哪扇门
attendance每个房间的 join / leave,带客户端与平台谁真的在会上 —— 这是一切奖励的依据
service_denialsuserid、原因、谁拒绝的、何时拒绝整个服务
房间封禁名单按房间,由房主设置某个房间拒绝某个人

主持台把这些呈现为出席成员登录记录准入四个视图,每一行都带 Carrier 地址 —— 于是主持人可以发消息、加好友、发奖励,而始终没有碰过对方的密钥

搬到交易站、商店或论坛里,要抄的形状很短:验证进来、记录使用、可选拒绝、永不持有密钥。

接收用户的条件

检查按顺序执行,第一个拒绝生效:先是服务级拒绝,然后是房主的封禁名单,最后才是你自己写的门槛。门槛拿到的是用户出示的身份 —— userid、已存的资料、从哪条路来、进哪个房间 —— 返回放行或一个理由。

registerRoomGate(async (ctx) => {
  if (!inRegion(ctx))
    return { ok: false, error: '该房间在你所在地区不可用', code: 'region' };
  return { ok: true };
});

registerRoomGate(async (ctx) => {
  if (!holdsToken(ctx.userid, ctx.profile))
    return { ok: false, error: '需要持有会员代币', code: 'token' };
  return { ok: true };
});
先了解用户,再写门槛

门槛的质量取决于它背后的记录。先把资料和出席记录攒起来,再基于它们设卡;而且只对用户出示的东西、或你自己能在链上查到的东西设卡,绝不要基于一个你要求对方交出来的秘密。

新服务接入清单

01
从你自己的域名下发 nonce

一次性、短有效期。用户签的是你的 origin,所以 nonce 必须来自你。

02
三扇门都要接

Decent 弹窗、Apps 启动、钱包签发的是同一个会话。少接一扇门只是把用户挡在外面。

03
对着 location.origin 验签

不是裸主机名,也不是 bundle id。这是最常见的接入错误。

04
存下资料和 Carrier 地址

留住 Carrier 地址,之后才能找到这个人 —— 发消息、加好友、发奖励。

05
记录登录与使用

从哪条路来、什么时候、做了什么。没有这些,既奖励不了也拒绝不了。

06
在需要之前就把拒绝通道做好

服务级拒绝加按房间封禁。等出事了再补,只会更糟。

07
最后才加门槛

地域、代币、NFT —— 基于出示的身份来写,绝不基于你保管的秘密。

更深的参考资料

线级契约、密码学原语(是 X25519 / XEdDSA,不是 Ed25519)、以及原生 WebView 路径,都随 Beagle Meet 源码一起归档。当前链接可以在 beagles 群里问。

下一篇给你的应用接入 Beagle 登录