定制身份
您可以在进行认证时使用自己的定制身份提供者。 您的身份提供者可遵循 IBM Cloud® App ID 所支持认证机制之外的任何认证机制,包括专有或原有认证机制。
概述
通过自带身份提供者,可以创建使用您自己的协议的定制认证流程。 您将拥有更多控制权,例如针对要共享的信息或存储的信息。
请务必先配置定制提供者,然后再将其添加到应用程序。
我何时需要使用此流程?
App ID 未提供对特定身份提供者的直接支持时,您可以使用定制身份流程将认证协议桥接到 App ID 的现有认证流程。 例如,您希望使用 GitHub 或 LinkedIn 来允许用户登录。 可以使用身份提供者的现有 SDK 来方便地提供用户认证信息,然后打包这些信息,并将其与 App ID 进行交换。
在许多情况下,需要不同的认证流程:
- 专有内部身份提供者
- 第三方身份提供者
- 复杂认证流程,可包括专有多因子机制
有时,原有提供者可能会使用其自己的定制认证协议。 由于定制身份流程使认证与授权完全相分离,因此可以采用所选的任何认证机制,然后向 App ID 提供生成的认证信息。 所有机制都不会公开用户凭证。
从技术角度来说,此流程是如何运作的?
自定义身份认证工作流程建立在 JWT-Bearer 扩展授权类型之上,该类型在 OAuth 2.0 Authorization Grants 的断言框架 [RFC7521 ]中有所定义。 为交换 App ID 令牌的用户信息,您的身份验证架构会使用非对称 RSA 密钥对与 App ID 建立信任关系。 建立了信任后,就可以使用 JWT-Bearer 授权类型,用已签名 JWT 中已验证的用户信息来交换 App ID 令牌。
此流程是什么样子的?
与所有认证流程一样,定制身份也需要应用程序能够与 App ID 建立一定程度的信任关系,以确保身份提供者用户信息的完整性。 定制身份利用非对称 RSA 公用和专用密钥对来建立其信任关系。 根据体系结构需求,定制身份支持两种信任模型,区别仅在于专用密钥的存储位置和用途。
|
|---|
| 与传统 OAuth 2.0 流程一样,最安全的信任模型会在身份提供者与授权服务器之间创建关系;在本例中,直接创建与 App ID 的关系。 在此模型下,身份提供者负责存储专用密钥并对 JWT 断言签名。 这些断言传递到 App ID 时,将使用匹配的公用密钥对其进行验证,这可确保来自身份提供者的用户信息在传输过程中不会被恶意变更。 |
|
|---|
| 或者,可以将信任模型基于应用程序与 App ID 之间的关系。 在此工作流程中,专用密钥存储在服务器端应用程序中。 成功认证后,应用程序负责将身份提供者响应转换为 JWT,并使用其专用密钥对 JWT 签名,然后应用程序会将该令牌发送到 App ID。 由于此身份提供者与 App ID 之间没有关系,因此该体系结构将创建较弱的信任模型。 虽然 App ID 可以信任服务器端应用程序发送的信息,但无法确定这些数据是由身份提供者发送的原始信息。 |
生成 JSON Web 令牌
您可以通过生成 JSON 网络令牌,将经过验证的用户数据转换为自定义身份 JWT。 必须使用与预先配置的公用密钥匹配的专用密钥来对此令牌签名。 有关令牌签名库的列表,请查看 https://jwt.io/.
示例 JWT 格式
{
// Header
"alg": "RS256",
"typ": "JOSE",
// Payload
// Required
"iss": "String", // Should reference your identity provider
"aud": "String", // Must be the OAuth server URL name
"exp": "Int", // Should be a value with a short lifespan
"sub": "String", // Must be the unique user ID provided by your identity provider
// Normalized claims (optional)
"name": "String",
"email": "String",
"locale": "String",
"picture": "String",
"gender": "String",
// Custom Scopes to add to access token (optional)
scope="custom_scope1 custom_scope2"
// Other custom claims (optional)
role="admin"
}
| 字段 | 描述 |
|---|---|
iss |
应该包含对身份提供者的引用。 |
aud |
OAuth 服务器 URL。 格式: https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>。 |
exp |
令牌有效的时间长度。 出于安全原因,令牌应该具有较短且明确的生命周期。 |
sub |
身份提供者提供的唯一用户标识。 |
| 规范化声明 | 在此请求的响应中返回的身份令牌中提供了所有规范化声明。 使用 /userinfo 端点可找到更多定制声明。 |
| 作用域 |
缺省情况下,所有 App ID 令牌都包含一组预设的作用域。 您可以通过执行下列其中一项操作来请求额外的作用域:
|
检索 App ID 令牌
要在定制提供程序与 App ID 之间创建网桥,您需要具有 App ID 令牌。 要获取服务令牌,请使用 /token 端点交换已验证的用户信息。
Post /token
Content-Type: application/x-www-from-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
assertion=<payload>
scope="<spaceSeparatedScopeArray>"
| 变量 | 描述 |
|---|---|
| 内容类型 | applications/x-www-from-urlencoded |
| grant_type | urn:ietf:params:oauth:grant-type:jwt-bearer |
| assertion | JWS 有效内容字符串。 |
| 作用域 | 定制作用域的空格分隔列表。 |