核心 SDK 约定
基本约定
- 核心部分应仅包含与平台无关的功能。
- 核心部分应命名为
{$language}并位于代码库的根目录下。例如,logto/js/js,logto/kotlin/kotlin。 - 核心包应在 Logto 范围内命名为
{$language}。例如,@logto/js,io.logto.sdk:kotlin。
基本要求
任何核心 SDK 应包含:
- 类型
- 工具函数
- 核心功能
类型
OidcConfigResponse
身份提供商 (IdP) 的配置,可以通过 /oidc/.well-known/openid-configuration API 获取。
属性
| 名称 | 类型 |
|---|---|
| authorizationEndpoint | string |
| tokenEndpoint | string |
| endSessionEndpoint | string |
| revocationEndpoint | string |
| jwksUri | string |
| issuer | string |
CodeTokenResponse
/oidc/token 的响应数据(通过授权码)。
属性
| 名称 | 类型 | 必需 |
|---|---|---|
| accessToken | string | ✅ |
| refreshToken | string | |
| idToken | string | ✅ |
| scope | string | ✅ |
| expiresIn | number | ✅ |
RefreshTokenResponse
通过刷新令牌刷新令牌时,/oidc/token 的响应数据(通过刷新令牌)。
属性
| 名称 | 类型 | 必需 |
|---|---|---|
| accessToken | string | ✅ |
| refreshToken | string | ✅ |
| idToken | string | |
| scope | string | ✅ |
| expiresIn | number | ✅ |
IdTokenClaims
ID 令牌携带的声明。
属性
| 名称 | 类型 | 必需 |
|---|---|---|
| sub | string | ✅ |
| aud | string | ✅ |
| exp | number | ✅ |
| iat | number | ✅ |
| iss | string | ✅ |
| atHash | string | |
| username | string | |
| name | string | |
| avatar | string |
工具函数
generateCodeVerifier
generateCodeChallenge
基于代码验证器生成代码挑战。
此方法加密代码验证器,并以 URL 安全的 Base64 格式返回结果。
我们在 Logto V1 中将加密算法硬编码为 SHA-256。
参考
参数
| 名称 | 类型 | 备注 |
|---|---|---|
| codeVerifier | string | 由 generateCodeVerifier 生成 |
返回类型
string
generateState
decodeIdToken
解码一个 ID 令牌而不进行秘密验证。
返回一个 IdTokenClaims,其中包含所有在有效负载部分的令牌声明。
参数
| 名称 | 类型 |
|---|---|
| token | string |
返回类型
IdTokenClaims
抛出
token不是有效的 JWT。
verifyIdToken
验证一个 ID 令牌是否合法。
验证签名密钥
OIDC 支持 JSON Web Key Set。
此函数接受来自第三方库 (jose) 的 JsonWebKeySet 对象进行验证。
// JsonWebKeySet 示例
{
"keys": [
{
"kty": "RSA",
"use": "sig",
"kid": "xxxx",
"e": "xxxx",
"n": "xxxx"
}
]
}
验证声明
- 验证 ID 令牌中的
iss是否与此令牌的发行者匹配。 - 验证
aud(受众)声明是否等于客户端 ID。 - 验证当前时间是否在过期时间之前。
- 验证签发时间 (
iat) 是否不超过当前时间的 +/- 1 分钟。
参考
参数
| 名称 | 类型 |
|---|---|
| idToken | string |
| clientId | string |
| issuer | string |
| jwks | JsonWebKeySet |
返回类型
void
抛出
- 验证签名密钥失败
- 验证声明失败
verifyAndParseCodeFromCallbackUri
验证登录回调 URI 是否合法,并返回从回调 URI 中提取的 code。
验证回调 URI
- 验证
callbackUri应以redirectUri开头 - 验证
callbackUri中没有error(参见 Error Response 中的重定向 URI)。 - 验证
callbackUri包含state,应等于你在generateSignInUri中指定的state值。 - 验证
callbackUri包含参数值code,你将在请求/oidc/token(通过刷新令牌)时使用。
参数
| 名称 | 类型 |
|---|---|
| callbackUri | string |
| redirectUri | string |
| state | string |
返回类型
string
抛出
- 验证失败
核心功能
fetchOidcConfig
通过请求 /oidc/.well-known/openid-configuration 返回 OidcConfigResponse。
参数
| 名称 | 类型 | 备注 |
|---|---|---|
| endpoint | string | OIDC 服务端点 |
返回类型
OidcConfigResponse
抛出
- 获取失败
generateSignInUri
参数
| 名称 | 类型 | 必需 | 备注 |
|---|---|---|---|
| authorizationEndpoint | string | ✅ | |
| clientId | string | ✅ | |
| redirectUri | string | ✅ | |
| codeChallenge | string | ✅ | |
| state | string | ✅ | |
| scopes | string[] | 实现可能会根据语言规范而有所不同。 | |
| resources | string[] | 实现可能会根据语言规范而有所不同。 | |
| prompt | string | 默认值:consent。 |
URL 将基于 authorizationEndpoint 生成,并包含以下查询参数:
登录 URL 查询参数
| 查询键 | 必需 | 备注 |
|---|---|---|
| client_id | ✅ | |
| redirect_uri | ✅ | |
| code_challenge | ✅ | |
| code_challenge_method | ✅ | 硬编码为 S256。 |
| state | ✅ | |
| scope | ✅ | scope 始终包含 openid 和 offline_access,即使输入的 scope 提供了空或空的 scope 值。 |
| resource | 我们可以多次将 resource 添加到 uri,后端会将它们转换为列表。例如 resource=a&resource=b | |
| response_type | ✅ | 硬编码为 code。 |
| prompt | ✅ |
返回类型
string
generateSignOutUri
参数
| 名称 | 类型 | 必需 |
|---|---|---|
| endSessionEndpoint | string | ✅ |
| idToken | string | ✅ |
| postLogoutRedirectUri | string |
要生成的 URL 将基于 endSessionEndpoint,并包含以下查询参数:
注销 URL 查询参数
| 查询键 | 必需 | 备注 |
|---|---|---|
| id_token_hint | ✅ | 输入的 idToken 参数 |
| post_logout_redirect_uri | 输入的 postLogoutRedirectUri 参数 |
返回类型
string
fetchTokenByAuthorizationCode
通过请求 /oidc/token(通过授权码)获取令牌 (CodeTokenResponse)。
参数
| 名称 | 类型 | 必需 |
|---|---|---|
| tokenEndpoint | string | ✅ |
| code | string | ✅ |
| codeVerifier | string | ✅ |
| clientId | string | ✅ |
| redirectUri | string | ✅ |
| resource | string |
HTTP 请求
- 端点:
/oidc/token - 方法:
POST - 内容类型:
application/x-www-form-urlencoded - 负载:
| 查询键 | 类型 | 必需 |
|---|---|---|
| grant_type | string: 'authorization_code' | ✅ |
| code | string | ✅ |
| code_verifier | string | ✅ |
| client_id | string | ✅ |
| redirect_uri | string | ✅ |
| resource | string |
返回类型
CodeTokenResponse
抛出
- 获取失败
fetchTokenByRefreshToken
通过 /oidc/token(通过刷新令牌)获取令牌 (RefreshTokenTokenResponse)。
参数
| 名称 | 类型 | 必需 |
|---|---|---|
| tokenEndpoint | string | ✅ |
| clientId | string | ✅ |
| refreshToken | string | ✅ |
| resource | string | |
| scopes | string[] |
HTTP 请求
- 端点:
/oidc/token - 方法:
POST - 内容类型:
application/x-www-form-urlencoded - 负载:
| 查询键 | 类型 | 必需 | 备注 |
|---|---|---|---|
| grant_type | string: 'refresh_token' | ✅ | |
| refresh_token | string | ✅ | |
| client_id | string | ✅ | |
| resource | string | ||
| scope | string | 我们用空格连接 scopes 值来构造这个 scope 字符串 |
返回类型
RefreshTokenTokenResponse
抛出
- 获取失败
revoke
请求 /oidc/token/revocation API 通知授权服务器先前获取的刷新或访问令牌不再需要。
参数
| 名称 | 类型 | 备注 |
|---|---|---|
| revocationEndpoint | string | |
| clientId | string | |
| token | string | 要撤销的令牌 |
HTTP 请求
- 端点:
/oidc/token/revocation - 方法:
POST - 内容类型:
application/x-www-form-urlencoded - 负载:
| 查询键 | 类型 |
|---|---|
| client_id | string |
| token | string |
返回类型
void
抛出
- 撤销失败