跳到主要内容

身份验证与权限范围

每次调用 Kaleidr 平台 API 都必须携带一种凭据。凭据分为三种,API 对它们的处理方式各不相同:

  • 可公开密钥用于在浏览器中标识您的组织。它不能直接调用 API,必须先交换为会话。
  • 会话令牌是浏览器实际调用 API 时使用的凭据。它有效期较短,并绑定到一个网站来源和一种产品。
  • 服务器密钥是由您的后端在每次请求中直接发送的机密凭据。

本文介绍每种凭据的发送方式、会话交换过程、各个权限范围开放的功能、vendor 权限范围的授予方法,以及每种身份验证错误的原因和解决办法。如果您想了解凭据泄露后可能带来的影响,请参阅安全模型。

凭据类型​

凭据前缀存放位置使用方式套餐
可公开密钥kld_pk_live_…页面源代码向会话交换接口发送一次;其他所有端点均拒绝该密钥Free、Pro、Enterprise
会话令牌kld_sess_live_…浏览器内存从颁发令牌的页面发起每次运行时调用时发送由可公开密钥或已发布地图生成
服务器密钥kld_sk_live_…仅存放在您的后端每次运行时调用均发送;如果请求携带 Origin 标头,则会被拒绝Pro、Enterprise
旧版密钥kld_live_…您的后端与服务器密钥一样,可直接作为凭据使用。轮换后会生成服务器密钥仅限现有密钥

使用密钥管理 API 并设置 environment: "test" 创建的密钥,会以 test 代替 live(kld_pk_test_…、kld_sk_test_…)。测试密钥无法加载底图瓦片。

密钥仅在创建或轮换时完整显示一次。Kaleidr 只存储哈希值,因此无法恢复丢失的密钥;请轮换密钥。

发送凭据​

可以通过任意一个标头发送凭据。所有端点均接受这两种标头。

Authorization: Bearer kld_sk_live_…
X-Api-Key: kld_sk_live_…

如果请求同时携带两者,且 Authorization 的值以 Kaleidr 前缀开头,则优先使用它;否则读取 X-Api-Key。切勿把服务器密钥放入 URL。

各类凭据在运行时端点(会话交换端点除外)上的行为如下:

凭据运行时端点的处理结果
可公开密钥401 publishable_requires_session。必须先交换为会话。
没有 Origin 标头的服务器密钥接受密钥,然后检查 IP 允许列表、权限范围、允许的产品、配额和速率限制。
带有 Origin 标头的服务器密钥403 server_key_in_browser。浏览器在跨站请求时会添加 Origin,API 因而能够识别网页中使用的服务器密钥。
来自令牌颁发来源的会话令牌接受。
带有不同 Origin 的会话令牌403 session_origin_mismatch。
不带 Origin 的已发布地图会话令牌403 session_origin_mismatch。

JavaScript SDK 会更早实施同一规则:Kaleidr.mount 在浏览器中发现 kld_sk_… 密钥时,不会发起请求,而是直接拒绝。

会话交换​

可公开密钥需要通过一个端点换取会话令牌。SDK 在每次使用密钥挂载组件时自动完成交换,并负责刷新令牌。只有在自行构建浏览器客户端时,您才需要直接调用此端点。

POST https://api.kaleidr.com/inference-api/b2b/v1/sdk/sessions
X-Api-Key: kld_pk_live_…
Content-Type: application/json

{ "product": "chat" }

必须提供 product,其值只能是 chat、editor、viewer 或 tile。请求必须带有 Origin 标头;浏览器会自动添加。

{
"session_token": "kld_sess_live_eyJhbGciOi…",
"expires_in": 900,
"product": "chat",
"basemap_style_id": null
}
字段含义
session_token运行时调用使用的凭据,格式为 kld_sess_{env}_{token}。
expires_in有效期,单位为秒。通过密钥生成的会话有效期为 900 秒。请读取该字段,不要在代码中写死数值。
product会话绑定的产品。
basemap_style_id组织的默认底图;未设置时为 null。

会话的绑定条件​

  • 一个来源。 即交换请求的 Origin。来自其他来源的调用会被拒绝。
  • 一种产品。 tile 会话不能调用聊天端点。
  • 受限的权限范围集合。 会话仅包含产品所需的权限范围:聊天使用 ai,编辑器使用 design,瓦片使用 maps,查看器不需要权限范围。只有当密钥具有 vendor 且套餐允许(Enterprise)时,聊天会话才会保留 vendor。任何其他产品的会话都不会包含这一权限范围。

刷新​

客户端无法要求更长的有效期。应在 expires_in 到期前重新交换。SDK 会在到期前 90 秒刷新;当后台标签页重新变为可见,且会话距离到期不足 90 秒或已经到期时,也会刷新;刷新失败后则每隔 30 秒重试。如果首次交换失败,组件挂载就会失败,且不会自动重试。

每次为 product: "tile" 交换会话,都会消耗组织额度中的一次地图加载;其他产品交换会话不收费。会话交换具有单独的每密钥速率限制,与运行时调用分开计算。请参阅配额与速率限制。

检查顺序​

会话交换在遇到第一项失败的检查时立即停止:

顺序检查项目失败结果
1密钥有效401 Invalid or missing API key
2密钥的会话交换速率限制429 rate_limited
3密钥是可公开密钥403 publishable_key_required
4请求包含 Origin 标头403 origin_required
5如果密钥设置了允许来源列表,请求来源必须在其中403 origin_not_allowed
6密钥的产品限制没有排除该产品403 product_not_allowed
7当前套餐包含该产品403 tier_capability_not_allowed
8密钥具有产品所需的权限范围403 insufficient_scope;如果密钥具备该权限范围,但当前套餐不再支持,则为 tier_capability_not_allowed
9对于 tile:仍有可用地图加载次数429 map_load_quota_exceeded

在终端中测试​

curl -s https://api.kaleidr.com/inference-api/b2b/v1/sdk/sessions \
-H "X-Api-Key: kld_pk_live_…" \
-H "Origin: https://www.example.com" \
-H "Content-Type: application/json" \
-d '{"product":"chat"}'

这种测试之所以有效,是因为 Origin 是普通 HTTP 标头,任何非浏览器客户端都可以自行设置。因此,允许来源列表属于浏览器控制机制,并非保密手段。请参阅 CORS 与允许的来源。

已发布地图的会话​

如果从 Studio 发布的地图在其 Kaleidr AI 磁贴中开启了 Control Tower 或 Popup Window,访客无需在网页中使用密钥即可聊天。网页改为使用地图的公开 ID 以及要开启的功能交换会话:

POST https://api.kaleidr.com/inference-api/b2b/v1/sdk/share-sessions
Content-Type: application/json

{ "share_id": "your-map-id", "feature": "control_tower" }
{ "session_token": "kld_sess_live_eyJhbGciOi…", "expires_in": 300, "product": "chat" }

这种会话仅适用于聊天,包含 ai 权限范围,有效期为 300 秒,费用计入地图所有者的组织。它永远不包含 vendor。会话只能在发起交换的网页使用;如果调用缺少 Origin 或来源不同,将被拒绝。拒绝原因如下:

状态码错误代码原因
403origin_required请求缺少 Origin 标头。
404not_found不存在使用此 ID 的已发布地图或分享链接,或分享链接的地图已取消发布。
403chat_disabled地图的 Kaleidr AI 未开启所请求的功能。
403origin_not_allowed网页不在地图允许的域名列表中。
403owner_has_no_organization地图所有者没有可计费的组织。
403tier_capability_not_allowed地图所有者的套餐不包含聊天功能。
429rate_limited此地图或此地址发起的会话交换过多。

配置方法请参阅已发布地图上的 Kaleidr AI。

权限范围​

每个密钥都有权限范围。每个端点系列都需要对应的权限范围。

权限范围开放的功能适用对象
ai/chat/* 和 /retrieval/* 端点Chat,以及调用聊天或查询端点的任何后端
design/design/* 端点Editor 会话,以及调用设计端点的任何后端
maps底图会话Tile
vendor本身不开放端点,但允许聊天回答使用组织自行发布的数据。已上传数据时的 Chat

除非另有指定,新密钥默认具有 ai、maps 和 design。在 Free 套餐下,密钥始终具有 Free 的全部能力:恰好这三个权限范围以及全部四种产品(chat、editor、viewer、tile),无论请求指定哪一种产品。vendor 从不默认授予,只有 Enterprise 组织可以创建包含它的密钥。

如果创建密钥时指定的权限范围或产品超出套餐支持范围,请求会收到 403 tier_capability_not_allowed。系统不会不报错就悄悄移除请求中的内容。典型情况是在 Free 或 Pro 中请求 vendor。

权限范围在创建密钥时就已固定。 此后任何端点或设置都无法更改。轮换密钥会继承原有权限范围,但会去除当前套餐已不支持的部分。若需更改权限范围,请创建新密钥并撤销旧密钥。

Free 套餐的密钥轮换遵循 Free 规则。 在 Free 下,轮换后生成的可公开密钥具有 Free 的全部能力(ai、maps、design 及全部四种产品),不受旧密钥权限范围影响。Free 不允许轮换服务器密钥或旧版密钥:请求会被拒绝,并返回 403 free_plan_publishable_only。

密钥实际权限取决于密钥与套餐两者中更严格的一方​

每个请求都会对照您组织当前套餐的功能范围,检查密钥中保存的权限范围和产品设置。更改套餐不会直接修改密钥,但会改变密钥能够执行的操作:

  • insufficient_scope:密钥从未获得相应权限范围。解决方法:换用具有该权限范围的密钥。
  • tier_capability_not_allowed:密钥具备相应权限范围,但当前套餐不支持。解决方法:更改套餐。

vendor 是第二种情况的例外,因为它不开放任何端点。当低于 Enterprise 的套餐中仍保存着具有 vendor 的密钥时,系统不会拒绝请求:请求可以成功,但生成的回答不会使用您组织的数据。

如果密钥的产品列表为空,则可访问当前套餐包含的所有产品。没有任何权限范围的密钥在所有端点都会被拒绝。

产品限制适用于所有密钥​

allowed_products 可以将密钥限制为 chat、editor、viewer 和 tile 中的部分产品。所有密钥类型都会在使用时执行这一限制:

密钥检查限制的时机拒绝结果
可公开密钥会话交换时,检查请求的 product403 product_not_allowed
服务器密钥或旧版密钥每次运行时请求,检查端点所属产品403 product_not_allowed

每个端点系列都归属于其所需权限范围对应的产品:

端点权限范围受限密钥必须允许的产品
/chat/*、/retrieval/*aichat
/design/*designeditor

因此,即便服务器密钥具有 ai 权限范围,如果创建时指定了 "allowed_products": ["tile"],调用 /chat/control/stream 仍会被拒绝并返回 403 product_not_allowed。如果服务器密钥仅允许 viewer,则无法调用任何运行时端点,因为已发布地图不需要密钥。如果希望密钥可以访问其权限范围允许的所有端点,请将该列表留空。

此处不会再次检查会话令牌,因为交换时它已经绑定到单一产品。

FreeProEnterprise
可公开密钥是是是
服务器密钥否是是
ai、maps、design是是是
vendor否否是

与 Free 相比,Pro 增加了服务器密钥功能,并提高了活跃密钥数量上限。完整套餐对照表请参阅获取 API 密钥。

vendor 权限范围​

vendor 本身不开放任何端点。它决定使用此密钥生成的聊天回答能否在 Kaleidr 通用知识之外,使用您组织自己发布的数据。从上传到生成回答的完整流程,请参阅您的数据:概览。

哪些组织可以使用:

  • Free 和 Pro 不能持有 vendor。无论是否提交 vendor_acknowledged,申请创建包含该权限范围的密钥都会收到 403 tier_capability_not_allowed,并且不会创建密钥。
  • Enterprise 可以创建具有 vendor 的密钥。

此权限范围负责通过密钥读取数据。上传数据属于另一项单独权限,授予组织所有者或管理员,而不是任何密钥;该权限同样仅向 Enterprise 开放,Free 和 Pro 无法上传业务数据。已登录用户在 Kaleidr Studio 中添加到地图的文件属于另一项功能,所有套餐均可使用,且无法通过任何权限范围读取:请参阅地图上的数据集。

API Keys 页面无法授予 vendor。请通过密钥管理 API 创建包含该权限范围的密钥:

curl -s https://api.kaleidr.com/shared-api/api-keys \
-H "Authorization: Bearer $KALEIDR_ACCOUNT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "store-locator-chat",
"key_type": "publishable",
"scopes": ["ai", "vendor"],
"vendor_acknowledged": true,
"allowed_origins": ["https://www.example.com"]
}'

如果可公开密钥包含 vendor,就必须提供 vendor_acknowledged: true。否则请求会返回 422 vendor_scope_requires_acknowledgement。这是因为可公开密钥存在于公开的页面源代码中;任何访问该网页的人都能读取此密钥可访问的数据。服务器密钥无需提供此确认。

在为可公开密钥添加 vendor 之前:

  • 每个网站使用一把独立密钥。只有确实需要使用您数据生成回答的网站,才应授予 vendor。
  • 将已发布数据视为该网站上的公开信息。不要发布成本价格、尚未公布的费率或任何不愿展示在网页上的内容。
  • 请注意,已经发放的会话不会自动获得该权限范围。创建带有 vendor 的密钥后,只有之后交换生成的会话才会获得它。

要撤回 vendor,请撤销原密钥并创建不带该权限范围的替代密钥。撤销会从下一次请求起生效,包括已经发放的会话。

当组织不再使用 Enterprise 套餐时​

从 Enterprise 降级为 Pro 或 Free,不会修改已有密钥,也不会使其全部失效:

项目降级后的情况
具有 vendor 的密钥其他功能仍可正常使用,但聊天回答不再使用您的数据。不会通过错误、状态或字段提示这一变化。
降级前发放的浏览器会话会话被终止。下一次请求返回 401,SDK 随后获取不带 vendor 的新会话。
轮换包含 vendor 的密钥在 Pro 中:返回 201 表示成功。替代密钥继承相同权限范围,但不包含 vendor;产品列表保持不变。在 Free 中:可公开密钥的替代密钥包含 ai、maps、design 和全部四种产品,不受旧密钥设置影响;服务器密钥和旧版密钥的轮换会被拒绝,返回 403 free_plan_publishable_only。
创建包含 vendor 的密钥返回 403 tier_capability_not_allowed,请求被拒绝。
您的发布版本在任何套餐下,所有者和管理员仍可通过上传 API 列出、取消发布和删除版本。Free 和 Pro 的上传及发布请求会被拒绝,返回 403 vendor_data_not_on_plan。

如果组织重新升级至 Enterprise,仍然保存有 vendor 的密钥可以再次访问数据。若密钥是在低级套餐下轮换生成的,则不会自动恢复这一权限范围;请创建新密钥。

限制密钥​

限制适用密钥可在 API Keys 页面设置可通过密钥管理 API 设置拒绝结果
允许的来源可公开密钥是是(allowed_origins)交换时返回 403 origin_not_allowed
允许的产品所有密钥否是(allowed_products)可公开密钥在交换时返回 403 product_not_allowed;服务器或旧版密钥在每次运行时请求中返回该错误。请参阅产品限制。
IP 允许列表服务器密钥和旧版密钥否是(allowed_ips)403 ip_not_allowed
每月上限所有密钥否是(monthly_cap_tokens)429 quota_exceeded
到期时间所有密钥否是(expires_at)指定日期之后返回 401
权限范围所有密钥否仅在创建时设置(scopes)403 insufficient_scope

允许的来源。 最多 100 项,每项格式为 scheme://host[:port],不包含路径。可公开密钥的列表为空表示允许任何来源。详情及失败条件请参阅 CORS 与允许的来源。

IP 允许列表。 最多可以添加 100 个 IP 地址或 CIDR 网段。涵盖所有地址的网段(/0)会被拒绝;如果要允许任意地址,请将列表留空。如果密钥配置了允许列表,但无法确定调用者的地址,请求也会被拒绝。

每月上限。 限制一把密钥在一个计费周期内能够消耗的组织 AI 积分数量。详情请参阅配额与速率限制。

已发放的会话如何受到变更影响​

每次请求都会重新检查会话关联的原始密钥,因此撤销权限能够迅速生效。但增加权限需要重新交换会话。

密钥或账户变更对已发放会话的影响
密钥被撤销,或轮换时没有宽限期下一次请求返回 401。
会话来源被移出密钥的允许来源列表下一次请求返回 401。
会话对应产品被移出密钥的允许产品列表下一次请求返回 401。
套餐降级降级前发放的会话返回 401。降级后交换的会话访问套餐已不再支持的功能时,返回 403 tier_capability_not_allowed。
新增或降低每月上限下一次请求起生效。
移除每月上限下一次交换会话后生效。
套餐升级下一次交换会话后生效。

由于会话仅持续几分钟,因此等待“下一次交换”通常不会太久。SDK 会在刷新时自动应用变化,无需修改代码。

密钥管理 API​

您可以在 kaleidr.com/api-keys 的 API Keys 页面设置密钥名称、类型及允许的来源。本文介绍的其他设置均通过该页面使用的同一套 API 完成。

  • 基础 URL: https://api.kaleidr.com/shared-api/api-keys
  • 身份验证: 通过 Authorization: Bearer 发送已登录 Kaleidr 账户的访问令牌,且该账户必须是组织的所有者或管理员。此处不接受平台密钥。目前没有专门用于密钥管理的长期有效凭据。
  • 组织: 不指定组织时,默认使用您的主要组织。若要指定其他组织,创建密钥时请在 JSON 请求体中传入 org_id;其他所有路由则通过查询参数 ?org_id= 传入。创建路由中的 org_id 查询参数会被忽略。
方法和路径用途成功响应
POST /创建密钥201,密钥对象及 plaintext_key
GET /列出活跃密钥,按新到旧排序200
GET /{id}/events?limit=1..200查看密钥审计事件200
PATCH /{id}修改限制条件200,密钥对象
POST /{id}/rotate替换密钥201,新密钥及 plaintext_key
POST /{id}/revoke撤销密钥200,密钥对象

没有删除密钥的路由;如需停用,请撤销密钥。

创建密钥时支持以下字段:

字段类型默认值说明
name字符串,1 至 200 个字符必填
org_idUUID您的主要组织要创建密钥的组织。必须放在请求体中;此路由忽略查询参数。
key_type"publishable" 或 "server""publishable"Free 套餐不支持 "server",会返回 403 free_plan_publishable_only。
environment"live" 或 "test""live"
scopes字符串数组["ai", "maps", "design"]可用值为 ai、maps、design、vendor。其他值会返回 422 unknown_scope。套餐不支持的权限范围(例如 Enterprise 以下的 vendor)会返回 403 tier_capability_not_allowed。
allowed_origins字符串数组,最多 100 项[]对可公开密钥,空列表表示允许任何来源。
allowed_products字符串数组[]可选 chat、editor、viewer、tile。空列表表示全部。其他值返回 422 unknown_product。该设置适用于可公开密钥、服务器密钥和旧版密钥;请参阅产品限制。
allowed_ips字符串数组,最多 100 项[]IP 地址或 CIDR 网段。
monthly_cap_tokens整数,0 或更大无1 或更大的值会限制密钥;0 或 null 表示无上限。
expires_at未来的日期和时间无
vendor_acknowledged布尔值false可公开密钥包含 vendor 时必填(Enterprise)。

PATCH 支持 name、allowed_origins、allowed_products、allowed_ips、monthly_cap_tokens 和 expires_at。仅发送希望更改的字段;明确指定 null 可以清除该值。不支持 scopes。

rotate 接受 { "grace_hours": 0 },值范围为 0 至 8760。替代密钥继承旧密钥的权限范围,但会移除当前套餐不再允许的权限。Free 套餐中,替代密钥总是包含 Free 的全部能力,并且无法轮换服务器密钥或旧版密钥(403 free_plan_publishable_only)。当值为 0 时,旧密钥及其会话立即失效。设置宽限期后,旧密钥可继续使用至宽限期结束,期间仍计入套餐的活跃密钥上限,且不可再次轮换。API Keys 页面默认使用 24 小时宽限期。

上述路由的错误请参阅错误:密钥管理。

身份验证错误​

401 表示 API 完全不接受此凭据。403 表示 API 识别了您的身份,但拒绝执行请求。这些错误均采用 {"detail": "<code>"} 格式。

在浏览器中,如果请求因凭据或来源而被拒绝,响应将不包含 CORS 标头,因此页面看到的是 CORS 错误,而不是响应体。若请求是在后续权限范围或套餐检查阶段被拒绝,页面可以读取响应,SDK 会报告 kaleidr session exchange failed (403)。两种情况下,都应在浏览器开发者工具的 Network 选项卡中打开对应请求,查看错误代码。请参阅 CORS 与允许的来源。

状态码错误代码原因解决方法
401Invalid or missing API key缺少凭据;密钥不存在、被撤销或过期;会话过期;关联密钥被撤销、失去该来源或产品的权限,或在套餐降级前颁发的会话;组织被暂停或没有套餐。在 API Keys 页面检查密钥的值和状态。对于会话,请重新交换。
401publishable_requires_session可公开密钥被发送至运行时端点。先交换为会话,或从后端使用服务器密钥调用。
403publishable_key_required用服务器密钥或旧版密钥调用会话交换。交换时使用 kld_pk_… 密钥。
403origin_required会话交换请求没有 Origin 标头。从浏览器网页发起请求。
403origin_not_allowed网页来源不在密钥的允许来源列表或已发布地图的允许域名列表中。将准确的来源加入密钥,或将域名加入地图。
403product_not_allowed密钥允许的产品不包括本次产品:交换时指定的 product,或服务器/旧版密钥所调用端点归属的产品。修改 allowed_products 或使用其他密钥。
403insufficient_scope密钥创建时未获得端点或产品需要的权限范围。使用具备该权限范围的密钥。权限范围无法修改。
403tier_capability_not_allowed密钥有该权限范围或产品,但当前套餐不支持。在 kaleidr.com/billing 更改套餐。
403server_key_in_browser服务器密钥随 Origin 标头一起发送。将请求移至后端。如果密钥曾出现在网页源代码中,请轮换密钥。
403session_origin_mismatch会话令牌从不同于颁发来源的地址使用,或已发布地图会话在缺少 Origin 时使用。在实际使用令牌的网页中重新交换会话。
403ip_not_allowed带有 IP 允许列表的服务器密钥或旧版密钥被未获准的地址使用。从允许的地址发起调用,或更改 allowed_ips。
403chat_disabled已发布地图交换:地图的 Kaleidr AI 未开启所请求的功能。在 Studio 中地图的 Kaleidr AI 磁贴里开启 Control Tower 或 Popup Window。
403owner_has_no_organization已发布地图交换:地图所有者没有组织。所有者必须创建组织或加入组织。
404not_found已发布地图交换:找不到使用该 ID 的已发布地图或分享链接。检查 ID,并确认地图已发布。

包括 429 和 5xx 响应在内的完整目录,请参阅错误。

相关文档​