メインコンテンツまでスキップ

ルーティングアクション

デバイスID管理

このアクションは、CHIPIN_DEVICE_CONTEXT Cookie が存在しない場合、新しいデバイスIDをを発行します。 デバイスIDはPRNG(擬似乱数生成器)を使用して生成された48ビットの数値で、base64で 64文字の文字列にエンコードされます。

CHIPIN_DEVICE_CONTEXT Cookie が存在する場合は、JWTを検証し、 iss, exp の妥当性をチェックします。 sub の値をデバイスIDとして使用します。有効期限が再発行閾値を過ぎている場合は、CHIPIN_DEVICE_CONTEXT Cookie を再発行します。 exp 以外の値は引き継がれます。 デバイスIDはメモリ上に保存して管理しているわけではないので、サーバ側で無効化することはできません。セッションの有効期限が切れるまで有効です。

新しくデバイスIDを生成した場合、および再発行した場合はレスポンスヘッダに Cookie を以下のように追加します。

Set-Cookie: CHIPIN_DEVICE_CONTEXT=*JWT*;HttpOnly;Secure;SameSite=Strict;

サブドメインに shareCookie: true が設定されている場合は、CHIPIN_DEVICE_CONTEXT Cookie の Domain 属性にサブドメインの FQDN を設定します。 これにより、同じサブドメイン配下の仮想ホスト間でセッションを共有できます。

JWTのクレームは API Gateway のリクエストオブジェクトの変数として保存されます。 JWTのクレームおよびリクエストオブジェクト上の変数名は以下の通りです。

クレーム名説明変数名
issstringデバイスIDを発行した仮想ホストのFQDNsession_originator
substringデバイスID.session_id
cnstringデバイスのCN(Common Name)session_cn
iatinteger発行日時(UNIXタイムスタンプ)session_start_at
expinteger有効期限(UNIXタイムスタンプ)session_expire_at
ただし、cn は利用者が設定した場合のみ設定されます。
type
required
string
Value: "setDeviceId"
expiration
integer
Default: 15552000

デバイスIDの有効期限。単位は秒で、デフォルトは 15552000 秒 (180日)。 この時間の半分を過ぎると、CHIPIN_DEVICE_CONTEXT Cookie が再発行される。 この時間を過ぎると、デバイスIDは無効となる。

{
  • "type": "setDeviceId",
  • "expiration": 15552000
}

サービス確認

このアクションは、SPN Hub 上で指定されたサービスが利用可能かどうかをチェックします。 利用可能である場合は、アクションは成功しますが、利用可能でない場合は 503 Service Unavailable エラーを返します。 そのレスポンスでは JavaScript により /.waitforAvailable の SSE を取得してサービスが利用可能になるのを待ちます。

type
required
string
Value: "checkoutServices"
services
Array of strings <urn> [ items <urn > ]
{
  • "type": "checkoutServices",
  • "services": [
    ]
}

認証

このアクションは、CHIPIN_SESSION_ID Cookie の値をキーとして、セッション情報を取得します。 状況に応じて以下の処理を行います。

状況処理
パスがリダイレクトパス(oidcRecirectPath パラメータで指定)と一致する場合パラメータに付与されている認可コードを使用して IdP からアクセストークンとリフレッシュトークンを取得します。成功した場合はリクエストのパスを元のパスに書き換えて次のフローに進みます。
CHIPIN_SESSION_ID Cookie が存在しない失敗を返す
CHIPIN_SESSION_ID Cookie が存在するが、セッション情報がセッションテーブルに見つからない失敗を返す
CHIPIN_SESSION_ID Cookie が存在し、セッション情報がセッションテーブルに見つかったセッション情報のアクセストークンを確認して、次のフローに進む

セッション情報のアクセストークン確認

セッション情報のアクセストークンの状態により、以下の処理を行います。

トークンの状態処理
アクセストークンの有効期限が切れていないセッション情報をリクエストオブジェクトの変数として保存して処理を進めます。
アクセストークンの有効期限が切れているリフレッシュトークンを使用してアクセストークンを取得します
前行でトークンの取得に失敗した失敗を返します。

トークン取得処理

トークンエンドポイントの仕様に従って IdP からトークンを取得します。 リクエストのメソッドはPOST、Content-Type ヘッダは application/x-www-form-urlencoded とします。

リクエストボディには以下のパラメータを指定します。

パラメータ名
grant_typeauthorization_code(認可コードで取得する場合) または refresh_token(リフレッシュトークンで取得する場合)
code認可コード (grant_type が authorization_code の場合)
refresh_tokenリフレッシュトークン (grant_type が refresh_token の場合)
redirect_urihttps://\{virtual-host-fqdn\}\{oidcRecirectPath パラメータで指定された値\} (grant_type が authorization_code の場合)
client_idoidcClientId パラメータで指定された値
client_secretoidcClientSecret パラメータで指定された値

取得に成功した場合は、以下の動作を行います。

  • セッション情報を作成し、セッション情報テーブルに保存します。更新の場合はトークンのみを上書きします。
  • レスポンスヘッダに Set-Cookie ヘッダを追加して CHIPIN_SESSION_ID Cookie にセッションIDを設定します。Cookie が設定済みの場合でも有効期限を更新します。

失敗を返す場合のレスポンス

失敗を返す場合のレスポンスはリクエストのパスがログイン画面へのリダイレクトを受け入れられるかどうかによって異なります。

  • 失敗原因がOIDC IdPへの接続エラーなどのサーバ側のエラーである場合、500 Internal Server Error レスポンスを返します
  • ログイン画面へのリダイレクトを受け入れられる場合でメソッドがGETの場合、ログイン画面へのリダイレクト処理を行います。
  • 上記以外の場合、401 Unauthorized レスポンスを返します。このとき、Accept ヘッダーで application/json が指定されている場合は JSON 形式で、text/html が指定されている場合は HTML 形式でレスポンスボディを返します。

ログイン画面へのリダイレクト

以下の処理を実施して、 IdP のログイン画面へのリダイレクトを行います。

  • レスポンスの Location ヘッダに IdP の認証要求URLを指定
  • URLには認証要求エンドポイント(oidcAuthorizationEndpoint パラメータで指定)を使用
  • トークンエンドポイントの仕様に従ってクエリパラメータとして以下を指定
    パラメータ名
    response_type"code"
    client_idoidcClientId パラメータで指定された値
    redirect_urihttps://\{oidcAuthorizationEndpoint パラメータで指定された値\}\{oidcRecirectPath パラメータで指定された値\}?original_path=\{元のリクエストのURLをパーセントエンコーディングしたもの\}をパーセントエンコーディングしたもの
    scope"openid"
    state{ランダムな値} (CSRF 対策のために使用される。実装ではセッション情報に保存し、リダイレクト後のコールバックで検証すること)
    nonce{ランダムな値} (ID トークンの再生攻撃対策のために使用される。実装ではセッション情報に保存し、ID トークン受領後に検証すること)
  • ステータスコードを 302 に設定

次のフローに進む

セッション情報をリクエストオブジェクトの変数として保存します。 認可コードで新しくトークンを受け取る処理をした場合には、その original_path クエリパラメータで指定されたパスにリクエストのパスを書き換えます。 その後、ルーティングチェインの次のルールに従って処理を続行します。

type
required
string
Value: "authentication"
oidcClientId
string

セッション情報を取得するために使用する OIDC クライアントのIDを指定します。

oidcClientSecret
string

セッション情報を取得するために使用する OIDC クライアントのシークレットを指定します。

oidcAuthorizationEndpoint
string

OIDC IdP の認可エンドポイントのURLを指定します。

oidcRecirectPath
string

OIDC の認可コードフローにおけるリダイレクトURIのパス部分を指定します。 例えば、/auth/callback と指定すると、https://{virtual-host-fqdn}/auth/callback がリダイレクトURIとなります。

oidcTokenEndpoint
string

OIDC IdP のトークンエンドポイントのURLを指定します。

oidcService
string

OIDC IdP のトークンエンドポイントを提供する SPN上のサービス名を指定します。指定されると、TokenエンドポイントにSPN経由でアクセスします。 この場合、アクセスは HTTP の平文でのアクセスとなり、 SPN 上のサービスに送られます。

acceptLoginRedirectPathRegex
string

ログイン画面へのリダイレクトを受け入れられるリクエストのパスを正規表現で指定します。 例えば、^/app/.*$ と指定すると、/app/ 配下へのリクエストにおいてのみセッションの取得に失敗した場合はログイン画面へのリダイレクトを返します。 デフォルトでは、すべてのパスにおいてセッションの取得に失敗した場合は 401 Unauthorized を返します。

{}

プロキシ

リクエストをプロキシ先のサービスに転送するためのアクションです。 前フェーズまでで作成されたレスポンスは破棄され、プロキシ先サービスから返却されたものが新しいレスポンスとなります。 このアクションは、リクエストを別のマイクロサービスに転送するために使用されます。

type
required
string
Value: "proxy"
target
required
string

プロキシ先サービスのURN。

noBody
boolean

true の場合、リクエストボディは転送されない。 デフォルトは false で、リクエストボディは転送される。

{
  • "type": "proxy",
  • "target": "\"urn:chip-in:service:example-realm:cms-service\"",
  • "noBody": false
}

リダイレクト

リダイレクトを行うためのアクション。レスポンスの stauts は 302 に設定される。 リダイレクト先のURLは、レスポンスの Location ヘッダに設定される。 このアクションは、リクエストを別のURLに転送するために使用される。

type
required
string
Value: "redirect"
target
string

レスポンスの Location ヘッダに設定されるリダイレクト先のURL。

{}

ジャンプ

別のルーティングチェーンにリクエストを転送するためのアクション。処理中のチェーンは終了し、転送先のチェーンが新たに開始される。

type
required
string
Value: "jump"
target
required
string

ルーティングチェーンのURN。

{
  • "type": "jump",
  • "target": "urn:chip-in:routing-chain:example-realm:cms-chain"
}

変数設定

evalexpr の式を評価して、変数に値を設定するアクション。 このアクションは、リクエストやレスポンスの情報を参照して、変数に値を設定するために使用される。

type
required
string
Value: "setVariables"
required
object

設定する変数のキーと値のペア。

{
  • "type": "setVariables",
  • "variables": {
    }
}

ヘッダー設定

HTTP ヘッダーの設定を行うためのアクション。 このアクションは、リクエストやレスポンスのヘッダを設定するために使用される。

type
required
string
Value: "setHeaders"
target
required
string
Enum: "request" "response"

ヘッダの設定先。request の場合はリクエストヘッダ、response の場合はレスポンスヘッダ。

required
object

設定するヘッダのキーと値のペア。

{
  • "type": "setHeaders",
  • "target": "response",
  • "headers": {
    }
}

BFF 認証

BFFとしての認証を行う。