出站鉴权
出站鉴权用于配置 Soln 调用外部 API 时使用的凭证。从 集成 菜单打开 OpenLink,选择一个 OpenLink 后,在详情面板的 出站鉴权 页签中配置。
出站鉴权归属于单个 OpenLink,保存的配置会应用到该 OpenLink 下的所有出站调用。
- 打开 OpenLink
- 选择目标 OpenLink
- 打开 出站鉴权 页签
- 如果还没有配置,点击 去配置;如果已有配置,点击 编辑
- 选择鉴权方式
- 填写必填字段
- 点击 保存配置
已有密钥配置时,如果不需要替换密钥,编辑时可以留空密钥字段。只有需要更新凭证时,才输入新的密钥值。
生效时机
出站鉴权在执行时读取配置,所以保存后下一次执行就生效,不需要重新发布流程。
| 执行场景 | 行为 |
|---|---|
| 出站流程 | Studio 脚本会带上该凭证,脚本里每次 studio.http.request 调用都会用这份凭证签名或携带令牌 |
| 触发方式为 轮询 的入站流程 | Studio 源脚本在向外部系统读取数据时带上该凭证 |
| 其他执行,例如 Webhook 入站、查询数据、消息推送流程 | 不会添加出站凭证,因为这些执行不会走到 Studio HTTP 运行时 |
| 鉴权页签上的 验证连接 | 用同一套规则验证已保存的配置 |
使用哪份配置:
- 流程绑定上指定的鉴权配置(如果绑定了)
- 否则使用该 OpenLink 的默认鉴权配置,且必须是启用状态
凭证会在脚本自身请求头之后应用,所以同名请求头会被覆盖。没有启用中的默认配置时,出站调用不带凭证;如果流程绑定的是已停用的配置或属于其他 OpenLink 的配置,执行会直接失败。
鉴权方式
| 鉴权方式 | 必填字段 | 说明 |
|---|---|---|
| 无 | 无 | 外部系统不需要 OpenLink 级鉴权时使用 |
| Basic Auth | 用户名、密码 | 发送用户名和密码凭证 |
| Bearer Token | 请求头名称、访问令牌 | 请求头通常使用 Authorization,前缀通常是 Bearer |
| 动态 JWT Bearer | 算法、Secret、Issuer、Audience、Subject、Token 有效期、请求头名称 | 每次出站 HTTP 请求前即时生成一个签名 JWT;算法可选 HS256、HS384、HS512 |
| API Key | 挂载位置、API Key 名称、API Key 值 | API Key 可以放在 Header 或 Query 中 |
| HMAC 签名 | App ID、App Secret、签名 Header、签名算法 | 使用 HMAC-SHA256、HMAC-SHA384 或 HMAC-SHA512 签名;时间戳、Nonce 和签名内容规则为可选 |
| OAuth2 Client Credentials | Client ID、Client Secret、Token 地址 | 用 grant_type=client_credentials 和 HTTP Basic 客户端认证请求访问令牌;Scope 和 Audience 是可选令牌请求参数 |
| 自定义 Header / Query | 凭证 JSON、密钥 JSON | 自行映射 Header 或 Query,并从密钥 JSON 引用密钥 |
每个 OpenLink 只保留一份默认出站鉴权配置。保存后凭证会应用到该 OpenLink 下的所有出站调用;选择 无 时保留配置,但不会添加任何鉴权请求头。
请求头示例
以下示例只展示 OpenLink 出站鉴权会添加的请求头,请求体统一用空的 JSON 表示。
无
POST /api/orders HTTP/1.1
Host: api.partner.example
Content-Type: application/json
{}
Basic Auth
POST /api/orders HTTP/1.1
Host: api.partner.example
Authorization: Basic ZGVtby11c2VyOmRlbW8tcGFzc3dvcmQ=
Content-Type: application/json
{}
请求头的值由 Basic 加上 用户名:密码 的 Base64 组成。
Bearer Token
POST /api/orders HTTP/1.1
Host: api.partner.example
Authorization: Bearer <token>
Content-Type: application/json
{}
请求头名称和前缀来自配置,默认是 Authorization 和 Bearer。
动态 JWT Bearer
POST /api/orders HTTP/1.1
Host: api.partner.example
Authorization: Bearer <本次请求实时签发的 JWT>
Content-Type: application/json
{}
Runtime 会在请求前即时签发 Token,iss、aud、sub、iat、exp 和 jti 始终存在。
API Key
POST /api/orders HTTP/1.1
Host: api.partner.example
X-API-Key: <api-key>
Content-Type: application/json
{}
POST /api/orders?api_key=<api-key> HTTP/1.1
Host: api.partner.example
Content-Type: application/json
{}
请求头名称或参数名称来自配置:Header 默认 X-API-Key,Query 默认 api_key。配置了前缀时,前缀会加在 Key 值前面。API Key 放在 Query 时,Runtime 在执行输出里会把它脱敏为 [REDACTED]。
HMAC 签名
POST /api/orders HTTP/1.1
Host: api.partner.example
X-App-Id: partner-app
X-OpenLink-Timestamp: 2026-09-18T06:30:00.000Z
X-OpenLink-Signature: 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
X-OpenLink-Nonce: 3f1c2f0e-6a1d-4a1f-9a53-1f2b3c4d5e6f
Content-Type: application/json
{}
签名是签名原文的小写十六进制结果,签名原文按配置的规则拼接,默认是 method + path + timestamp + body。只有配置了 Nonce Header 时才会额外发送 Nonce 请求头,新配置在控制台里默认填的是 X-OpenLink-Nonce。只有签名内容规则里包含 nonce 时,Nonce 才参与签名。
OAuth2 Client Credentials
POST /api/orders HTTP/1.1
Host: api.partner.example
Authorization: Bearer <从 Token 地址获取的访问令牌>
Content-Type: application/json
{}
Token 类型取自 Token 地址的响应,默认为 Bearer。
自定义 Header / Query
POST /api/orders?tenant=demo HTTP/1.1
Host: api.partner.example
X-Client-Id: demo-client
X-Client-Secret: <secret>
Content-Type: application/json
{}
只会带上凭证 JSON 和密钥 JSON 中定义的条目。
Bearer Token 字段
| 字段 | 说明 |
|---|---|
| 请求头名称 | 承载令牌的请求头 |
| 前缀 | 可选的令牌前缀,例如 Bearer |
| 访问令牌 | 密钥令牌值 |
动态 JWT Bearer 字段
动态 JWT Bearer 不会请求 Token 地址。Runtime 会在每次 Studio 出站 HTTP 请求前即时签发 Token,并注入配置的请求头;脚本不需要自己生成 JWT,如果脚本设置了同名请求头,会被 Runtime 覆盖。
| 字段 | 必填 | 说明 |
|---|---|---|
| 算法 | 是 | HS256、HS384 或 HS512 |
| Secret | 新建时是 | 共享签名密钥,最小长度随算法变化:HS256 为 32 字节、HS384 为 48 字节、HS512 为 64 字节;编辑时留空会保留当前 Secret |
| Issuer | 是 | 写入 iss Claim,必须与外部 API 接受的 Issuer 一致 |
| Audience | 是 | 写入 aud Claim,必须与目标 API 的 Audience 一致 |
| Subject | 是 | 写入 sub Claim 的集成操作员标识 |
| Name | 否 | 可选的 name Claim |
| Scope | 否 | 可选的 scope Claim |
| Token 有效期 | 是 | 30 到 3,600 秒之间的整数 |
| Header 名称 | 是 | 承载签名 Token 的请求头,默认为 Authorization |
| 前缀 | 否 | 添加在 Token 前的前缀,默认为 Bearer |
每个 Token 都包含 iss、aud、sub、iat、exp 和唯一的 jti;配置后还会包含 name 和 scope。Token 不会缓存。Secret 只保存在服务端:接口只返回密钥是否已配置和密钥字段名,不返回密钥值。
API Key 字段
| 字段 | 说明 |
|---|---|
| 挂载位置 | 选择 API Key 放在 Header 还是 Query 中 |
| API Key 名称 | Header 名称或 Query 参数名称 |
| API Key 值 | 密钥值 |
| 前缀 | 添加在 Key 值前面的可选前缀 |
HMAC 签名字段
| 字段 | 说明 |
|---|---|
| App ID | 公开的应用标识 |
| App Secret | 用于签名的密钥 |
| 签名 Header | 承载签名结果的请求头 |
| 签名算法 | HMAC-SHA256、HMAC-SHA384 或 HMAC-SHA512 |
| 时间戳 Header | 承载请求时间戳的请求头,默认 X-OpenLink-Timestamp |
| Nonce Header | 可选,用于防重放 |
| 签名内容规则 | 说明签名内容如何组成,例如 method、path、timestamp 和 body |
OAuth2 Client Credentials 字段
| 字段 | 说明 |
|---|---|
| Client ID | 在外部系统注册的客户端标识 |
| Client Secret | 该客户端的密钥;编辑时留空会保留当前 Secret |
| Token 地址 | 签发访问令牌的 Token 端点 |
| Scope | 可选,随令牌请求一起发送的授权范围 |
| Audience | 可选,随令牌请求一起发送的受众 |
自定义 Header / Query 字段
| 字段 | 说明 |
|---|---|
| 凭证 JSON | 用 headers、query、secretHeaders 或 secretQuery 描述出站映射,至少需要配置其中一项 |
| 密钥 JSON | 提供凭证 JSON 引用的密钥值;被引用的每个密钥都必须在该对象中存在 |
验证出站连接
在出站鉴权页签使用 验证连接,可以在真正依赖凭证之前确认它能用。
- 打开该 OpenLink 的 出站鉴权 页签
- 点击 验证连接
- 填写验证请求:地址、请求方法、可选 Body 和 Content-Type
- 点击 开始验证,查看结果
| 验证字段 | 说明 |
|---|---|
| 验证请求地址 | 有效且不含内嵌账号密码的 HTTPS 地址 |
| 请求方法 | GET、POST、PUT、PATCH、DELETE 或 HEAD,默认 GET |
| 请求 Body | 可选;GET 和 HEAD 请求不能包含 Body |
| Content-Type | 探测请求发送的内容类型 |
摘要卡片会展示验证状态和最后验证时间:
| 状态 | 含义 |
|---|---|
| 未验证 | 该配置还没有验证过 |
| 有效 | 使用当前凭证探测成功 |
| 无效 | 外部系统拒绝了当前凭证 |
| 已过期 | 鉴权配置本身已过期,需要重新处理 |
| 验证异常 | 探测因其他原因失败,例如端点不可达、被限流或返回其他错误状态 |
验证结果还会给出 HTTP 状态码和耗时(毫秒)。