自訂身分

當您鑑別時,可以使用自己的自訂身分提供者。 您的身分提供者可以符合任何鑑別機制,只要其為 IBM Cloud® App ID 支援之鑑別機制的替代方案,包括專屬或舊式鑑別機制。

概觀

帶入自己的身分提供者,您可以建立使用專屬通訊協定的自訂鑑別流程。 您具有更多的控制權,例如您要共用的資訊,或所儲存的資訊。

務必先配置您的自訂提供者,然後再將其新增至您的應用程式。

我何時該使用此流程?

當 App ID 沒有提供特定身分提供者的直接支援時,您可以使用自訂身分流程,將鑑別通訊協定橋接至 App ID 的現有鑑別流程。 例如,您要使用 GitHub 或 LinkedIn 來容許使用者登入。 您可以使用身分提供者的現有 SDK 來協助使用者鑑別資訊,然後將其包裝並與 App ID 交換。

有許多情境,需要不同的鑑別流程:

  • 專屬的內部身分提供者
  • 協力廠商身分提供者
  • 複雜的鑑別流程,其中可以包括專屬的多因子機制

有時,舊式提供者可能會使用自己的自訂鑑別通訊協定。 因為自訂身分流程會完全取消鑑別與授權的連結,所以您可以採用任何您選擇的鑑別機制,然後將產生的鑑別資訊提供給 App ID。 完全不公開使用者認證。

在技術上,這個流程如何運作?

自訂身分工作流程建基於 JWT-Bearer 延伸授予類型,此類型已在 Assertion Framework for OAuth 2.0 Authorization Grants [RFC7521 ] 中定義。 為了交換 App ID 令牌的使用者資訊,您的驗證架構透過使用非對稱 RSA 金鑰對,與 App ID 建立信任關係。 一旦建立信任,您就可以使用 JWT-Bearer 授權類型,以已簽署 JWT 內的已驗證使用者資訊交換 App ID 記號。

流程具有怎樣的外觀?

與所有鑑別流程一樣,自訂身分需要應用程式能夠建立與 App ID 的某種程度信任,以確保身分提供者使用者資訊的完整性。 自訂身分會採用非對稱的 RSA 公開和私密金鑰組,來建立其信任關係。 取決於您的架構需求,自訂身分支援兩個僅在儲存空間位置與使用私密金鑰方面有所不同的信任模型。

自訂身份驗證請求流程
自訂身份驗證的請求流程

身分提供者簽署流程
  1. 已簽署身分提供者
就像傳統 OAuth 2.0 流程一樣,最安全的信任模型會直接在您的身分提供者與授權伺服器之間建立關係;在此情況下,指的是 App ID。 在此模型下,您的身分提供者負責儲存私密金鑰並簽署 JWT 主張。 傳遞給 App ID 時,會以符合的公開金鑰來驗證這些主張,如此可確保在傳輸期間不會惡意地變更您身分提供者中的使用者資訊。
應用程式簽署流程
  1. 已簽署應用程式
或者,您也可以根據應用程式與 App ID 之間的關係來建立信任模型的基礎。 在此工作流程中,您的私密金鑰會儲存在伺服器端應用程式中。 在成功鑑別之後,您的應用程式會負責將身分提供者回應轉換為 JWT,並在應用程式將記號傳送至 App ID 之前,以其私密金鑰進行簽署。 由於這個身分提供者與 App ID 沒有關係,因此此架構會建立較弱的信任模型。 雖然 App ID 可以信任伺服器端應用程式所傳送的資訊,但它無法確定資料是由身分提供者所傳送的原始資料。

產生 JSON Web 記號

您可以透過產生 JSON Web 令牌,將已驗證的使用者資料轉換為自訂身分 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"
}
JWS 領域
欄位 說明
iss 應包含身分提供者的參照。
aud OAuth 伺服器 URL。 格式: https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID>
exp 記號有效的時間長度。 基於安全考量,它應該具有短的有效期限,且是特定的。
sub 身分提供者所提供的唯一使用者 ID。
正規化宣告 所有正規化宣告都是在身分記號中提供,而這個身分記號是為了回應此要求而傳回的。 可使用 /userinfo 端點來找到更多的自訂宣告。
範圍

依預設,所有 App ID 記號都包含一組預設範圍。 您可以執行下列其中一項來要求額外範圍:

  • 在 JWS 記號的範圍欄位中指定範圍。
  • 透過 /token 要求的 url-form 範圍參數來指定範圍。

擷取 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>"
所需的請求變數
變數 說明
Content-type applications/x-www-from-urlencoded
grant_type urn:ietf:params:oauth:grant-type:jwt-bearer
assertion JWS 有效負載字串。
範圍 以空格區隔的自訂範圍清單。