基于 JWT 的访问令牌
Salesforce 支持两种访问令牌:不透明令牌和基于 JSON Web 令牌 (JWT) 的访问令牌。不透明访问令牌被格式化为除非您调用 Salesforce 用户信息端点否则无法解码的字符串。基于 JWT 的访问令牌被格式化为 JSON 对象,其中包含授权应用程序所需的所有信息。这种透明格式使基于 JWT 的访问令牌更容易用于在 Salesforce 平台之外构建的服务。您可以在平台外服务上本地轻松解析和验证基于 JWT 的访问令牌,而无需调用 Salesforce 端点。通过本地自检令牌,您可以提高授权流的性能和效率。
所需的 Edition
| 适用于 Salesforce Classic 和 Lightning Experience |
| 适用于:所有版本 |
与不透明的访问令牌相比,基于 JWT 的访问令牌具有不同的功能和限制。例如,基于 JWT 的访问令牌只能用于访问 REST API。要查看令牌类型的比较,请访问 Salesforce 帮助中的访问令牌。
对于所有授权流,您可以颁发基于 JWT 的访问令牌。
令牌格式
基于 JWT 的访问令牌使用 JWT 结构,其中包含标题、有效载荷和签名。标题包含有关令牌的信息,例如令牌类型。有效载荷包含一组包含有关令牌、用户和应用程序信息的声明。签名部分包含令牌的加密签名。该签名由 Base64 编码的标题和有效载荷以及使用 alg 声明中指定的算法签名的密码组成。
以下是标题和有效载荷的详细概述。
| 标题声明 | 描述 |
|---|---|
alg(算法) |
用于签署基于 JWT 的访问令牌的算法,允许您验证该令牌自发布以来未被更改。Salesforce 仅支持 RS256 算法,因此此声明的值必须是 RS256。 |
typ(类型) |
在令牌中存储的内容类型。此声明有助于应用程序将令牌与其他类型的数据区分开来。对于基于 JWT 的访问令牌,此值为 JWT。 |
kid(密钥 ID) |
向 Salesforce 注册的字符串,表示密钥用于签署令牌,这有助于证明其身份。 |
tty(令牌类型) |
令牌的类型。该值设置为 sfdc-core-token。 |
tnk(租户密钥) |
租户密钥,用于标识发布了基于 JWT 的访问令牌的 Salesforce 组织。定义此值,以便 Salesforce 可以找到并验证该组织的正确公用密钥。 |
ver(版本) |
JWT 库的版本。 |
以下是示例标题。
{
"tnk": "example/00XXXXXX",
"ver": "1.0",
"kid": "CORE_ATJWT************",
"tty": "sfdc-core-token",
"typ": "JWT",
"alg": "RS256"
}有效载荷始终包含这些声明。
| 有效载荷声明 | 描述 |
|---|---|
aud(受众) |
JWT 访问令牌的目标受众,由其用例决定。aud 声明被格式化为字符串的 JSON 数组。 |
exp(到期时间) |
JWT 访问令牌的到期时间。在此时间或之后不能接受该令牌。到期时间必须是当前日期和时间之后。 |
iss(发行人) |
发布 JWT 访问令牌的 My Domain 登录 URL 或 Experience Cloud 站点的 URL。例如,MyDomainName.my.site.com。 |
mty
|
仅供内部使用。 |
nbf(不早于时间) |
客户端必须在nbf声明中表示的日期和时间之后收到 JWT。如果在此日期和时间之前发送 JWT,客户端将无法接受它。 |
sfi
|
保留供将来使用的内部标识符。 |
sub(主题) |
标识作为 JWT 访问令牌主体的用户。
|
scp(范围) |
Salesforce 支持的范围列表,包括自定义范围,格式化为范围名称的 JSON 数组。范围用空格分隔。令牌可以包括任何 Salesforce 范围,但不包括 full 范围。 |
有效载荷也可以包含这些可选声明。
| 有效载荷声明 | 描述 |
|---|---|
acx
|
仅供内部使用。 |
client_id(使用者密钥) |
颁发令牌的 Salesforce 外部客户端应用程序或连接的应用程序的使用者密钥。 |
iat(签发时间) |
发布 JWT 的时间。您可以用该声明的值来计算 JWT 已存在多长时间。 |
roles(角色列表) |
定义服务可用来控制访问的令牌属性,例如权限集和角色。Salesforce 完全控制该声明中的值。该声明并未包括用户访问权限的完整列表。例如,分配给用户的权限集有时不会显示在此列表中。 此声明中的值被格式化为带前缀的字符串数组。Salesforce 支持这些前缀。
有时,此请求是一个空数组。 |
obo (代表) |
拥有令牌的任何人都可以代表该声明中的值完成操作。对于 Salesforce,当您将来宾令牌传递到命名用户流时,此声明用于将 UVID 链接到命名用户。来宾令牌包含 sub 声明中的 UVID。在完成命名用户流后,新访问令牌将 UVID 放入 obo 声明中,并将用户 ID 存储在 sub 声明中。 |
以下是有效载荷的例子。由于此示例在 obo 声明中包含 UVID,因此您可以假设此令牌是在将 UVID 传递到命名用户流后颁发的。
{
"scp": "api",
"aud": [
"https://example.com"
],
"sub": "uid:005x00000000001",
"nbf": "1675197036",
"iss": "https://example.com", "exp": "1675198836",
"iat": "1675197036",
“obo”: “uvid:abcd-1234-efgh”,
"client_id": "***********",
“mty”: “oauth”,
“sfi”: “********”
}

