01 四档鉴权模式 本节摘要:服务端是「唯一中枢」,中枢必须管好「谁能进」。OpenWork 的鉴权不是简单的「登录/未登录」,而是四档鉴权模式:无需鉴权、客户端令牌、宿主、宿主令牌。本节讲清这四档各自适用什么场景、怎么判定,为后续的权限作用域(第 02 节)打基础。 一、为什么是四档 先想清楚鉴权的复杂性。不同资源有不同的「谁能访问」要求: 有些资源是公开的(如健康检查),不该要令牌。 有些是「登录用户都能看」的(普通浏览)。 有些是「只有所有者能管」的(管理操作)。 有些是「所有者签发的令牌才能调」的(特定授权)。 如果只有「要/不要令牌」二档,没法表达这种层次。四档鉴权模式就是为这种层次设计的——每档对应一类访问要求。
本节摘要:服务端是「唯一中枢」,中枢必须管好「谁能进」。OpenWork 的鉴权不是简单的「登录/未登录」,而是四档鉴权模式:无需鉴权、客户端令牌、宿主、宿主令牌。本节讲清这四档各自适用什么场景、怎么判定,为后续的权限作用域(第 02 节)打基础。
先想清楚鉴权的复杂性。不同资源有不同的「谁能访问」要求:
如果只有「要/不要令牌」二档,没法表达这种层次。四档鉴权模式就是为这种层次设计的——每档对应一类访问要求。
| 鉴权模式(auth) | 含义 | 典型场景 |
|---|---|---|
| none(无需鉴权) | 谁都能访问 | 公开资源(健康检查、能力声明等) |
| client(客户端令牌) | 任何有效令牌(bearer)即可 | 普通浏览/查询 |
| host(宿主) | 需宿主令牌 或 所有者级 bearer | 宿主专属操作 |
| host-token(宿主令牌) | 需宿主令牌(明确) | 特定宿主授权操作 |
请求进来 │ ▼ 看目标路由的 auth 模式 │ ├─ none ──► 不鉴权,直接处理 ├─ client ──► 要有效 bearer 令牌(任意 scope) ├─ host ──► 要宿主令牌 或 owner 级 bearer └─ host-token ──► 要宿主令牌
none 模式的资源不需要任何鉴权。典型例子:
这些资源「公开无害」,要令牌反而增加无谓门槛。
client 模式要求请求带一个有效的 bearer 令牌,但不限制令牌的 scope(任何 scope 都行,只要有效)。典型场景:
这档是「确认你是合法用户」,但不细分你是 owner 还是 viewer——那是下一节 scope 的事。
host 模式要求宿主令牌 或 owner 级 bearer。这档用于「宿主专属操作」——只有工作区所有者(或其签发的宿主令牌)才能做。典型场景:
注意 host 接受两种凭据:宿主令牌(所有者本机的特殊令牌)或 owner 级 bearer(所有者签发的令牌里 scope=owner 的)。这俩都代表「所有者级身份」。
host-token 模式只接受宿主令牌(不接受 owner bearer)。这比 host 更严格——必须是「宿主本机令牌」,不能是「所有者签发的 bearer」。用于「最敏感、必须本机」的操作。
💡 host vs host-token 的细微差别:
host接受「宿主令牌 或 owner bearer」(两种身份都行),host-token只接受「宿主令牌」(必须本机)。前者宽松些,后者最严。这种细分让最敏感的操作只能本机做,不能被远程 owner bearer 调。
每条路由注册时声明它的 auth 模式(第 3 章 01 节的路由结构含 auth 字段)。服务端匹配路由后,按声明的模式鉴权:
路由: { path: "/workspace/:id", auth: "client", ... } │ ▼ 请求匹配到这条路由 │ ▼ 按 auth="client" 鉴权 │ ├─ 请求带有效 bearer ──► 通过 └─ 没带/无效 ──► 401
注意:鉴权模式主要用于路由注册声明与日志。实际鉴权逻辑由几个鉴权函数实现(requireClient/requireHost/requireHostToken),它们在 handler 执行前被调用。
鉴权不通过,服务端返回标准 HTTP 错误码:
| 情况 | 状态码 | 含义 |
|---|---|---|
| 没带令牌/令牌无效 | 401 | 未授权 |
| 带了令牌但权限不够 | 403 | 禁止访问 |
这让客户端能区分「没登录(401)」和「登录了但没权限(403)」,分别处理。
四档模式讲清了,下一节讲令牌的「权力范围」——三级权限作用域。