トークンのカスタマイズ

App ID では、トークンを使用してユーザーの識別とリソースの保護を行います。 このサービスでトークンに挿入する情報は、カスタマイズできます。 トークンに情報を注入することで、追加のネットワーク・コールを設定することなく、実行時にアプリケーションで利用できるようになります。 トークンと、App ID でのトークンの使用方法について詳しくは、トークンについての説明を参照してください。

トークンの構成をカスタマイズして、セキュリティーとユーザー・エクスペリエンスの要件を満たすことができます。 しかし、トークンを奪われた場合には、悪意のあるユーザーが手にする情報や時間が増え、アプリケーションが被害を受ける可能性があります。 カスタマイズする前に、必ず、そのカスタマイズがセキュリティーに与える影響について理解してください。

カスタムのクレーム・マッピングについて

クレームとは、エンティティーが自身について、または他者のために出すステートメントのことです。 例えば、あるユーザーが ID プロバイダーを使用してあるアプリケーションにサインインした場合、プロバイダーはそのユーザーに関連した一連のクレーム (つまりステートメント) をそのアプリケーションに送信します。アプリケーションは、それをそのユーザーに関する既知の情報と一緒にグループ化することができます。 このように、サインインすると、構成されたとおりにそのユーザーの情報がアプリにセットアップされます。

どんなタイプのクレームを定義できますか?

App ID で提供されるクレームは、カスタマイズのレベルが異なるいくつかのカテゴリーに分類されます。

正規化クレーム
すべての識別トークンに、正規化クレームとして App ID が認識する一連のクレームが含まれています。 含まれている正規化クレームは、デフォルトで ID プロバイダーからトークンに直接マップされます。 クレームは明示的に省略することはできませんが、トークン内でカスタム・クレームで上書きできます。 このようなクレームには、nameemailpicturelocale があります。
制限付きクレーム
制限付きクレームとは、カスタマイズ機能に制限があり、カスタム・マッピングで上書きできないクレームのことです。 アクセス・トークンの場合、制限付きクレームは scope のみです。 上書きはできませんが、独自のスコープを使用して拡張することはできます。 scope をアクセス・トークンにマップするとき、その値はストリングでなければならず、その接頭部が appid_ であってもなりません。そうでないと無視されます。 識別トークンの場合、クレーム identitiesoauth_clients は変更も上書きもできません。
登録済みクレーム
登録済みクレームは、アクセス・トークンと識別トークンに含まれ、App ID で定義されているものです。 カスタム・マッピングでオーバーライドすることはできません。 このサービスでは、これらのクレームは無視されます。これらのクレームには issaudsubiatexpamrtenant があります。

トークンにクレームを定義しても、属性が変更または除外されることはありません。 実行時に、トークンに含まれている情報が変更されます。

クレームはトークンにどのようにマップされますか?

各マッピングは、データ・ソース・オブジェクトと、クレームの取得に使用される鍵によって定義されます。 最大ペイロードが 100 KB 未満であれば、各トークンに最大 100 個のクレームを挿入できます。 ネストされたクレームを使用する場合は、ドット構文を使用して指定できます。 例えば、nested.attribute です。

以下の例に示すように、クレームはトークンごとに別個に設定され、順次適用されます。

{
  "accessTokenClaims": [
    {
      "source": "saml",
      "sourceClaim": "moderator"
    },
    {
      "source": "saml",
      "sourceClaim": "viewer",
      "destinationClaim": "reader"
    }
  ],
  "idTokenClaims": [
    {
      "source": "saml",
      "sourceClaim": "attributes.uid"
    },
    {
      "source": "saml",
      "sourceClaim": "Name",
      "destinationClaim": "firstName"
    },
    {
      "source": "saml",
      "sourceClaim": "Country"
    }
  ]
}
クレームマッピング変数の説明
オブジェクト 説明
source クレームのソースを定義します。 オプションとしては、samlcloud_directoryfacebookgoogleappid_customattributes があります。
sourceClaim ソースから提供されるクレームを定義します。 ID プロバイダーのユーザー情報またはユーザーの App ID カスタム属性を参照できます。
destinationClaim オプション: トークンの現在のクレームをオーバーライドできるカスタム属性を定義します。

トークンの構成

API を使用して、App ID トークンに戻される情報をカスタマイズできます。

トークンの存続期間を構成する場合は、サービス・ダッシュボードで簡単に変更できます。 詳しくは、認証の管理を参照してください。

  1. 端末で、以下のコマンドを実行して API キーを取得します。

    ibmcloud iam api-key-create NAME [-d DESCRIPTION] [-f, --file FILE]
    
    APIキー作成コマンドのオプションを理解する
    オプション 説明
    NAME キーに割り当てる名前。 例えば、myKey です。
    DESCRIPTION キーの説明、またはその使用方法の説明。 例えば、"This is my App ID API key" です。
    FILE キーを格納する場所。 例えば、key_file です。
  2. 前のステップで取得した API キーを使用して IAM トークンを取得します。

    curl -k -X POST "https://iam.cloud.ibm.com/identity/token" \
    --header "Content-Type: application/x-www-form-urlencoded" \
    --header "Accept: application/json" \
    --data-urlencode "grant_type=urn:ibm:params:oauth:grant-type:apikey" \
    --data-urlencode "apikey=<apiKey>"
    
  3. サービスのインスタンスのテナント ID を取得します。 この値は、サービス資格情報またはアプリケーション資格情報の中にあります。

  4. トークンの構成によって、/config/tokens エンドポイントへの PUT 要求を行います。

    curl -X PUT "https://<region>.appid.cloud.ibm.com/management/v4/<tenantID>/config/tokens" \
    -H 'Content-Type: application/json' \
    -H "Authorization: Bearer <IAMToken>" \
    -d '{
       "access": {
             "expires_in": 3600
       },
       "refresh": {
             "enabled": true,
             "expires_in": 2592001
       },
       "anonymousAccess": {
             "enabled": false
       },
       "accessTokenClaims": [
             {
             "source": "roles"
             },
             {
             "source": "saml",
             "sourceClaim": "name_id",
             "destinationClaim": "id"
             }
       ],
       "idTokenClaims": [
             {
             "source": "saml",
             "sourceClaim": "attributes.uid"
             }
       ]
    }'
    
    トークンの構成を理解する
    変数 説明
    access: expires_in アクセス・トークンが有効である時間の長さ。 値が小さいほど、トークンの盗用に対する保護を強化できます。 この値は秒単位で指定し、300 から 86400 までの範囲の任意の整数にすることができます。 デフォルト値は3600です。
    refresh: expires_in リフレッシュ・トークンが有効である時間の長さ。 値が小さいほど、トークンの盗用に対する保護を強化できます。 この値は秒単位で指定し、86400 から 7776000 までの範囲の任意の整数にすることができます。 デフォルト値は 2592000 (30 日) です。
    anonymousAccess 匿名トークンが有効である時間の長さ。 匿名トークンは、ユーザーがアプリとの対話を開始するときにユーザーに割り当てられます。 ユーザーがサインインすると、匿名トークン内の情報が、そのユーザーに関連付けられたトークンに転送されます。 この値は秒単位で指定し、86400 から 7776000 までの範囲の任意の整数にすることができます。 デフォルト値は 2592000 (30 日) です。
    accessTokenClaims アクセス・トークンに関連したクレームのマップ時に作成されるオブジェクトを格納する配列。 ここには、ユーザーが選択した ID プロバイダーによって返される役割や固有の属性に関する情報を含めることができます。 注: ID プロバイダーの「roles」がタイトルのカスタム・クレームを既に使用している場合、両方の値を表示するために宛先クレームを使用するようにしてください。
    idTokenClaims 識別トークンへのクレームのマップ時にトークンに存在する情報を格納する配列。 構成に応じて、識別トークン内に「roles」が存在するようにすることを選択することもできます。

    作成するすべての要求にトークンの存続期間を設定する必要があります。 値を設定しない場合は、デフォルトが使用されます。 各カスタマイズ要求は、それまでの構成内容を上書きします。 API での存続期間の構成の指定は、サービス・ダッシュボードでの構成の指定と異なることに注意してください。

  5. トークンが返され、それをデコードすると、以下の例のような結果が表示されます。

    {
       "sub" : "1234567890",
       "name" : "John Doe",
       "exp" : 1564566,
       "roles" : ["admin", "manager"],
       "id": "<nameIDFromSaml>",
       "attributes.uid": "<uidFromSaml>"
       ...
    }