カスタム ID
認証時に独自のカスタム ID プロバイダーを使用できます。 IBM Cloud® App ID でサポートされている認証メカニズムの代替となる、任意の認証メカニズムに準拠した ID プロバイダーを使用できます (専有またはレガシーのものを含む)。
概要
独自の ID プロバイダーを導入することで、独自のプロトコルを使用したカスタム認証フローを作成できます。 共有する情報や保管する情報など、さらに自由に制御できます。
カスタム・プロバイダーを構成した後で、それをアプリケーションに追加するようにしてください。
このフローを使用できる状況
App ID が特定の ID プロバイダーを直接サポートしていない場合、App ID の既存の認証フローと認証プロトコルの間のブリッジとして、カスタム識別フローを使用することができます。 例えば、GitHub または LinkedIn を使用してユーザーにサインインを許可するとします。 ユーザー認証情報を容易に扱えるように ID プロバイダーの既存の SDK を使用してから、その情報をパッケージして App ID と交換することができます。
別の認証フローが必要になるシナリオは、以下のように多数あります。
- 専有の社内 ID プロバイダー
- サード・パーティーの ID プロバイダー
- 複雑な認証フロー (独自の多要素メカニズムが組み込まれていることがあります)
場合によっては、レガシー・プロバイダーで独自のカスタム認証プロトコルが使用されていることがあります。 カスタム識別フローによって認証が許可から完全に分離されるため、任意の認証メカニズムを採用し、それから得られる認証情報を App ID に提供することができます。 これらの処理はすべて、ユーザー資格情報を露出せずに実行できます。
このフローの技術的な仕組み
カスタム ID ワークフローは、Assertion Framework for OAuth 2.0 Authorization Grants [RFC7521 ] で定義されている JWT-Bearer 拡張グラント・タイプに基づいて構築されている。 App ID トークンのユーザー情報を交換するために、認証アーキテクチャーで、非対称 RSA 鍵ペアを使用して App ID との信頼関係を確立します。 信頼関係が確立されたら、JWT-Bearer 付与タイプを使用することで、App ID のトークンの署名付き JWT 内にある、検証済みユーザー情報を交換できます。
フローの概要
あらゆる認証フローの場合と同様に、カスタム識別を使用する場合も、ID プロバイダーのユーザー情報の整合性を確保するため、アプリケーションが App ID との一定レベルの信頼関係を確立できるようにする必要があります。 カスタム識別の場合、非対称 RSA 公開鍵/秘密鍵ペアを使用して、信頼関係を確立します。 カスタム識別は、アーキテクチャーの要件に基づいて 2 種類の信頼モデルをサポートします。2 つの違いはストレージ・ロケーションと秘密鍵の使用法のみです。
|
---|
従来の OAuth 2.0 フローと同様に、最もセキュアな信頼モデルでは、ID プロバイダーと許可サーバー (この場合は App ID) との間の直接の関係が作成されます。 このモデルでは、ID プロバイダーが秘密鍵の保管と JWT アサーションの署名を実行します。 これらのアサーションは、App ID に渡されると、対応する公開鍵を使用して検証されます。これにより、ID プロバイダーからのユーザー情報が転送中に故意に改ざんされていないことを確認できます。 |
|
---|
別の方式として、アプリと App ID との間の関係に基づいた信頼モデルを採用することもできます。 このワークフローでは、秘密鍵はサーバー・サイドのアプリケーションに保管されます。 認証が成功すると、アプリは、ID プロバイダーの応答を JWT に変換し、その秘密鍵を使用して JWT に署名します。その後、アプリはトークンを App ID に送信します。 このアーキテクチャーでは、この ID プロバイダーに App ID との関係がないため、信頼モデルは前者の方法より弱くなります。 App ID は、サーバー・サイドのアプリケーションによって送信された情報を信頼できますが、データが ID プロバイダーによって送信されたオリジナル・データであることを確証できません。 |
JSON Web トークンの生成
JSONウェブトークンを生成することで、検証済みのユーザーデータをカスタムID 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 |
ID プロバイダーへの参照を含める必要があります。 |
aud |
OAuth サーバー URL。 形式: https://<region>.appid.cloud.ibm.com/oauth/v4/<tenantID> 。 |
exp |
トークンが有効である時間の長さ。 セキュリティー上の理由から、短い存続期間を具体的に指定する必要があります。 |
sub |
ID プロバイダーによって提供される固有のユーザー ID。 |
正規化クレーム | すべての正規化クレームは、この要求に対する応答として返される、識別トークンで提供されます。 /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 ペイロード・ストリング。 |
スコープ | カスタム・スコープの空白文字区切りリスト。 |