Space Access Token
Space Access Token 是一种可以在一个 Space 内读取和写入内容的令牌。可以用它通过 CMA 创建、修改、删除内容,CDA 读取和 Upload 也用该令牌调用。签发时会将其绑定到一个 SpaceRole,由该角色决定令牌能做什么、能做到什么程度(可以对哪些 Content Type 执行哪些动作)。
与只读的 Delivery Access Token 不同,该令牌还能写入。而与绑定在整个用户账户上的 Personal Access Token 不同,它只限定于一个 Space,无法访问 Space 设置、组织、账户层面,也无法访问其他 Space。在 CMA 中,Space Access Token 是 Space 的下级资源,路径以 /spaces/{spaceId}/space-access-tokens 为基准。要把该令牌放在服务器上,还是放在公开的客户端(例如匿名写入)上,可根据服务自行决定。由于它是带有写入权限的强力令牌,需按令牌所在位置的暴露范围收窄所绑定的角色来确保安全(参见下文 安全:按暴露范围绑定角色)。
资源结构
下面是创建 Space Access Token 时的响应。sys(系统属性)中包含令牌值和范围,正文中有 name、description 和 allowedReferrers。
{
"sys": {
"id": "7WpR4mKq2bTnXfLc8Vd3HsJ9gEyAo",
"type": "SpaceAccessToken",
"space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
"user": { "sys": { "id": "3trmXRLdJIqc9GPBbyFYQQwYT32LnU", "type": "Refer", "targetType": "User" } },
"createdBy": { "sys": { "id": "9dLmQ2pVnRb8sTfWcXd3LhJ7gK", "type": "Refer", "targetType": "User" } },
"createdAt": "2026-06-19T02:15:38.472Z",
"updatedBy": { "sys": { "id": "9dLmQ2pVnRb8sTfWcXd3LhJ7gK", "type": "Refer", "targetType": "User" } },
"updatedAt": "2026-06-19T02:15:38.472Z",
"accessToken": "SPCATq8Lm2vK9pXfR1Zt0Nc4Wd6Hg5Ua2Ee9Ck3PoYx8Bj6Hg5Ua2Ee9Ck3Po…",
"scopes": ["SPACE_ACCESS_TOKEN"]
},
"allowedReferrers": [],
"description": "服装商城商品登记与修改用的服务器令牌",
"name": "商品后端服务器"
}主要键:
sys.id:Space Access Token 的唯一标识符。用于单条查询、修改、删除路径中的{spaceAccessTokenId}。sys.space:该令牌所属的 Space。令牌只在这一个 Space 中运行。sys.accessToken:调用 API 时使用的密钥令牌值。以SPCAT开头,签发后再次查询也会原样返回同一个值,因此需注意避免暴露(参见下文安全章节)。sys.scopes:令牌的权限范围。Space Access Token 在签发时始终为["SPACE_ACCESS_TOKEN"]。sys.user:该令牌的权限主体,即其专用用户。在签发时自动创建,所绑定的 SpaceRole 的权限会授予该用户。也就是说,令牌的实际权限来自该用户。它与实际签发该令牌的人(sys.createdBy)是不同的用户。name:创建时指定的令牌名称(例如商品后端服务器)。description:对令牌的说明(可选)。allowedReferrers:限制该令牌可以从哪些 origin 调用的列表。列表为空时不做限制。上面的示例是从服务器调用的令牌,因此把列表留空了(格式规则和判定方式参见 origin 格式规则和 Referer 判定)。
role(要绑定的 SpaceRole)是仅在创建请求正文中发送的输入值,不包含在响应资源中。所绑定的角色是以授予该令牌专用用户(响应中的 sys.user)的方式实现的,因此不会作为 role 字段返回到查询响应中。上例中的 accessToken 是密钥值,因此已替换为示例字符串。实际为一段以 SPCAT 开头的、较长的不透明字符串,签发后再次查询会返回同一个值。
系统属性 (sys)
每个 Space Access Token 都在 sys 对象中包含通用系统属性和令牌专有属性。space、user、createdBy、updatedBy 以 Refer 形式({ "sys": { "id", "type": "Refer", "targetType" } })出现。
| 属性 | 类型 | 说明 |
|---|---|---|
id | string | 资源的唯一标识符。 |
type | string | 资源种类。Space Access Token 始终为 "SpaceAccessToken"。 |
space | Refer<Space> | 该令牌所属的 Space。 |
user | Refer<User> | 该令牌的权限主体,即其专用用户。签发时自动创建,所绑定的 SpaceRole 的权限会授予该用户(令牌的实际权限来自该用户)。它与 createdBy(实际签发者)是不同的用户。 |
createdBy | Refer<User> | 签发该令牌的实际用户(权限主体是上面的 user)。 |
createdAt | string (date-time) | 创建时间。 |
updatedBy | Refer<User> | 最后一次修改的实际用户。 |
updatedAt | string (date-time) | 最后一次修改的时间。 |
accessToken | string | 调用 API 时使用的密钥令牌值。以 SPCAT 开头。签发后再次查询也会原样返回,因此须妥善处理以免向外部暴露。 |
scopes | string array | 令牌的权限范围。Space Access Token 始终为 ["SPACE_ACCESS_TOKEN"]。 |
正文属性:
| 属性 | 类型 | 说明 |
|---|---|---|
name | string (1~64) | 令牌名称。创建时指定。 |
description | string (≤128) | 令牌说明。可选。 |
allowedReferrers | string array (0~50) | 允许调用该令牌的 origin 列表。空列表表示不做限制。由于整体修改是整体替换,漏掉该项发送时列表会被清空,限制也随之解除。要保持原有限制,请把当前列表原样重新发送。签发之后仍然可以修改。 |
仅创建请求正文使用的输入:
| 属性 | 类型 | 说明 |
|---|---|---|
role | Refer<SpaceRole> | 要绑定的 SpaceRole 的 Refer。必填。该角色决定令牌的读取与写入范围。仅在创建时指定,签发后无法更改,也不会出现在响应中。 |
安全:按暴露范围绑定角色
Space Access Token 是一种连写入都能做的强力令牌。将其绑定到哪个 SpaceRole,就成了该令牌能做之事的边界,也是安全边界。要把该令牌放在服务器上,还是放在公开的客户端(例如匿名写入)上,可根据服务自行决定;安全并不靠“藏在哪里”,而是靠按暴露范围收窄所绑定的角色来确保。
- 在创建请求的
role中,填入只允许该用途所需动作的、范围狭窄的 SpaceRole 的sys.id。 比如商品登记用的服务器令牌,就绑定只允许对商品 Content Type 读取和写入的角色;公开的匿名写入令牌,就绑定只允许对帖子 Content Type 创建(create)的角色,按暴露范围做最小化绑定。 - 越是暴露给公开客户端的令牌,越要把角色收得更窄。 只应允许到即使该令牌泄露也能承受的范围。不要把
Administrator角色或范围宽泛的写入角色绑定到公开令牌上。此外,不要随手使用 SpaceRole 列表中的第一项,而应明确指定预期的、范围狭窄的角色的sys.id。 - 如果是从浏览器调用的令牌,请用
allowedReferrers把调用位置也一并收窄。 所绑定的角色决定用该令牌能做什么,这个列表则决定可以从哪里调用(参见 Referer 判定)。 - 对于向访问者公开的只读传递,没有写入权限的 Delivery Access Token 更合适。只在需要写入时才使用 Space Access Token,并按暴露范围收窄其角色。
accessToken是签发后仍会以同一个值被查询到的密钥值。在无需暴露的地方,不要以明文留在代码、日志、存储或错误消息中;一旦怀疑泄露,就删除以使其失效,并换成新令牌。
状态与约束
创建、修改时需遵守的值约束。
| 对象 | 约束 |
|---|---|
name | 1~64 个字符,必填(创建时)。 |
description | 128 个字符以内,可选。 |
role | SpaceRole 的 Refer,必填(创建时)。 |
allowedReferrers | 0~50 项。每一项都必须遵守下面的 origin 格式规则。 |
关于绑定与权限的规则:
- 要绑定的
role必须确实存在于该 Space 中。若填入不存在的角色的sys.id,创建会被拒绝。 - 调用者只能绑定自己在该 Space 中拥有的角色。这是为了防止通过绑定自己并不拥有的角色而给令牌赋予更高权限的约束,违反这一点的创建请求会被拒绝。但该 Space 的管理员(持有 Administrator 角色者)不受此约束,可以绑定任何角色。
- Space Access Token 是有数量限额的资源。超出当前方案的签发数量限额时,创建会被拒绝。各方案的限额请参阅 定价方案。
- 签发与管理(创建、查询、修改、删除)要求调用者角色的
settings中包含SETTING_SPACE_ACCESS_TOKEN。它与用于签发只读 Delivery Access Token 的SETTING_DELIVERY_ACCESS_TOKEN是彼此独立的操作,因此可以只授予传递令牌的签发权限,同时阻止签发该令牌(参见 SpaceRole)。 - 该 API 只能通过控制台登录会话和 Personal Access Token 调用。用 Space Access Token 自身无法创建其他 Space Access Token,即使在其绑定的角色中放入
SETTING_SPACE_ACCESS_TOKEN也是如此。
origin 格式规则
allowedReferrers 的每一项都是指向一个允许调用的 origin 的字符串。请按下面的形式填写。
"allowedReferrers": [
"https://shop.example.com",
"https://*.shop.example.com",
"http://localhost:3000"
]列表中最多可以放 50 项,同一个 origin 不能放两次。每一项需要遵守的规则如下。
- scheme 只能使用
https。http仅在localhost、127.0.0.1、[::1]上允许。 - 通配符只能以最前面的一个
*.标签的形式使用。路径中不能使用通配符。 - 主机名请用 ASCII 填写。国际化域名请以 Punycode 形式填入。
- 端口的范围是 1 到 65535。省略时按 scheme 的默认端口(
https为 443,http为 80)处理。 - 若填写了路径,则只有在与请求的路径完全一致时才能通过。浏览器会把路径做百分号编码后发送,因此路径中只能使用 ASCII。
- 带有用户信息(
user@)、查询(?)或片段(#)的项会被拒绝。
该检查在创建、整体修改、部分修改这三条路径上都会执行。只要有一项不符合规则,整个列表就不会被保存,请求会被拒绝,并在错误原因中给出其中一个不符合规则的项(参见错误)。
Referer 判定
签发之后用该令牌调用 API 时,每个请求都会应用 allowedReferrers 来判定能否通过。
- 列表为空时不做限制。从任何 origin 调用都能通过。
- 列表中只要有一项,就会按请求的
Referer头的值来判定。Origin头不在判定范围内。 - 请求没有
Referer头或该头的值为空时,请求会被拒绝。像服务器之间互相调用这样不发送Referer的地方要用的令牌,请把列表留空。 - 要通过判定,
Referer的 scheme、主机名、端口必须与列表中的某一项全部一致。若该项还带有路径,则路径也必须一致。 https://*.shop.example.com包含所有以.shop.example.com结尾的主机名(例如admin.shop.example.com),但不包含shop.example.com本身。若要同时允许两者,请把https://shop.example.com也作为一项另行加入。- 该判定作用于用该令牌发出的所有请求。无论调用 CMA 还是 CDA 的哪条路径都一样。
- 未通过判定的请求会以 HTTP
403被拒绝。返回的错误码见下面的错误。
错误
以下是处理 Space Access Token 时会遇到的错误码。所有资源共通的错误码,请参见通用错误。
| 错误码 | 条件 |
|---|---|
WGL400071 | allowedReferrers 中放入了不符合 origin 格式规则的项。创建、整体修改、部分修改时都会检查。 |
WGL404001 | role 中填入了该 Space 中不存在的 SpaceRole 的 sys.id。 |
WGL422001 | 调用者试图把自己在该 Space 中并不拥有的 SpaceRole 绑定到令牌上。该 Space 的管理员(持有 Administrator 角色的用户)不受此限制。 |
WGL429001 | 在已签发的 Space Access Token 数量达到当前方案上限的状态下,试图签发新的令牌。 |
WGL403001 | 调用者的角色没有 SETTING_SPACE_ACCESS_TOKEN 设置权限。该权限不仅在签发令牌时需要,查询、修改、删除时同样需要。 |
WEB403001 | 用指定了 allowedReferrers 的令牌从列表之外的 origin 发起了调用,或者请求中没有 Referer。该错误码不是在管理令牌时返回,而是在用该令牌发起请求时返回。 |
API
下面所有端点的基准 URL 均为 https://cma.weegloo.com/v1,并且 Authorization 头中需要用于向 CMA 认证的 Bearer 令牌。修改和部分修改 Space Access Token 时不需要 X-Weegloo-Version 头。
相关文档
- SpaceRole:定义要绑定到该令牌的角色(读取与写入范围)。
- Delivery Access Token:向访问者公开的只读传递令牌(客户端用)。
- Personal Access Token:绑定在整个账户上的、用于服务器与 CI 的 Weegloo User 令牌。
- 定价方案:各方案的 Space Access Token 签发数量限额。
