用 Beagle 登录
让用户证明自己是谁,而不必把密码或密钥交给你;同时留下一份诚实的记录:谁来过、怎么来的、做了什么。
2026 年 9 月身份本该像现实生活一样运作
用户在网络上的行为和足迹,应该像现实生活一样:有据可查,有信可查。你走进一家店,店主看得见你来了、怎么来的、待了多久——但他拿不走你的钥匙,也要不到你的密码。
这才是改变社交软件和平台生态的必有之路,更接近生活,而不是一个把身份吞掉的孤岛。Decent Network 应有的样子,是各有各的角色、各有各的身份,而不是某一个 App 独占登录。
| 角色 | 拿什么 | 不拿什么 |
|---|---|---|
| 用户 | 自己的密钥、自己的名字、自己的足迹 | 不把密码交给网站 |
| Beagle 客户端(网页 / CLI / iOS / Android) | 帮用户签名、出示身份 | 不替所有服务保管用户的会话 |
| 服务方(开会、交易、商店……) | 核验签名,记下谁来过、怎么来、做了什么 | 不拿用户的私钥和密码 |
| 网络(Carrier / userid / ENS) | 把身份与可联络地址公开到用户愿意公开的程度 | 不当成某一个 App 的账号库 |
身份不归自己所有时做不到、归自己所有后就能做到的四件事:
- 认识自己的用户 —— 他们从哪条路来、叫什么、怎么联系、参加过哪场会。
- 可以给奖励 —— 没有出席和贡献的记录,就发不出积分、代币或席位。
- 也可以拒绝服务 —— 这是店主决定为谁开门,不是平台没收钥匙。
- 设定接收用户的条件 —— 指定地域、持有某种代币、持有某个 NFT。条件写在你这边,核验用的是用户出示的身份。
Beagle Meet 已经是这样一个跑在线上的案例:开会的人不把钥匙交给会议室,会议室记下签到与出席,主持人可以奖励、可以拒绝、可以加门槛。把这套做法带到你的服务里——我们一起改。
服务方应该记录什么 —— 线上真实案例
Beagle Meet 不存私钥、不存助记词、不存密码。它存的是一个人使用这项服务时出示的样子,以及在这里做过的事。正是这份记录,才使奖励和拒绝成为可能。
| 记录 | 存了什么 | 主办方为什么需要它 |
|---|---|---|
| profiles | userid、名字、头像、Carrier 地址、从哪条路来、首次与最近出现时间 | 他是谁,以及怎么找到他 |
| profile_history | 名字 / 头像 / Carrier 变更前的值 | 足迹 —— 这个人一路是怎么呈现自己的 |
| auth_events | 每次登录的时间、来源、客户端、平台、origin | 他走的是哪扇门 |
| attendance | 每个房间的 join / leave,带客户端与平台 | 谁真的在会上 —— 这是一切奖励的依据 |
| service_denials | userid、原因、谁拒绝的、何时 | 拒绝整个服务 |
| 房间封禁名单 | 按房间,由房主设置 | 某个房间拒绝某个人 |
主持台把这些呈现为出席、成员、登录记录、准入四个视图,每一行都带 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 };
});门槛的质量取决于它背后的记录。先把资料和出席记录攒起来,再基于它们设卡;而且只对用户出示的东西、或你自己能在链上查到的东西设卡,绝不要基于一个你要求对方交出来的秘密。
新服务接入清单
一次性、短有效期。用户签的是你的 origin,所以 nonce 必须来自你。
Decent 弹窗、Apps 启动、钱包签发的是同一个会话。少接一扇门只是把用户挡在外面。
不是裸主机名,也不是 bundle id。这是最常见的接入错误。
留住 Carrier 地址,之后才能找到这个人 —— 发消息、加好友、发奖励。
从哪条路来、什么时候、做了什么。没有这些,既奖励不了也拒绝不了。
服务级拒绝加按房间封禁。等出事了再补,只会更糟。
地域、代币、NFT —— 基于出示的身份来写,绝不基于你保管的秘密。
线级契约、密码学原语(是 X25519 / XEdDSA,不是 Ed25519)、以及原生 WebView 路径,都随 Beagle Meet 源码一起归档。当前链接可以在 beagles 群里问。