概要
ラストマイル セキュリティのために、簡易な Basic 認証を使用できます。このポリシーは、ユーザー名とパスワードを取得し、Base64 でエンコードして、生成された値を変数に書き込みます。生成された値の形式は Basic
Base64EncodedString
です。この値は一般に、HTTP ヘッダー(Authorization ヘッダーなど)に書き込まれます。
このポリシーでは、Base64 でエンコードされた文字列で保管された認証情報を、ユーザー名とパスワードにデコードすることもできます。
動画: この動画では、基本認証ポリシーを使用して、ユーザー名とパスワードを Base64 でエンコードする方法を実演しています。
動画: この動画では、基本認証ポリシーを使用して、Base64 でエンコードされたユーザー名とパスワードをデコードする方法を実演しています。
サンプル
送信時のエンコード
<BasicAuthentication name="ApplyBasicAuthHeader"> <DisplayName>ApplyBasicAuthHeader</DisplayName> <Operation>Encode</Operation> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <User ref="BasicAuth.credentials.username" /> <Password ref="BasicAuth.credentials.password" /> <AssignTo createNew="false">request.header.Authorization</AssignTo> </BasicAuthentication>
上記のサンプル ポリシー構成では、エンコードされるユーザー名とパスワードは、<User>
要素と <Password>
要素の ref
属性で指定された変数から取得されます。これらの変数はポリシーの実行前に設定されている必要があります。一般に、変数には Key-Value マップから読み取られた値が代入されます。Key Value Map Operations ポリシーをご覧ください。
この構成では、Authorization という名前の HTTP ヘッダーが <AssignTo> 要素で指定され、バックエンド サーバーに送信される送信リクエスト メッセージに追加されます。
Authorization: Basic TXlVc2VybmFtZTpNeVBhc3N3b3Jk
<User>
と <Password>
の値は、コロンで連結されてから Base64 でエンコードされます。
次のエントリを持つ Key-Value マップがあるとします。
{ "encrypted" : true, "entry" : [ { "name" : "username", "value" : "MyUsername }, { "name" : "password", "value" : "MyPassword } ], "name" : "BasicAuthCredentials" }
BasicAuthentication ポリシーの前に次の KeyValueMapOperations ポリシーを配置して、Key-Value ストアから <User>
要素と <Password>
要素の値を抽出し、変数 credentials.username
と credentials.password
に入力します。
<KeyValueMapOperations name="getCredentials" mapIdentifier="BasicAuthCredentials"> <Scope>apiproxy</Scope> <Get assignTo="credentials.username" index='1'> <Key> <Parameter>username</Parameter> </Key> </Get> <Get assignTo="credentials.password" index='1'> <Key> <Parameter>password</Parameter> </Key> </Get> </KeyValueMapOperations>
受信時のデコード
<BasicAuthentication name="DecodeBaseAuthHeaders"> <DisplayName>Decode Basic Authentication Header</DisplayName> <Operation>Decode</Operation> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <User ref="request.header.username" /> <Password ref="request.header.password" /> <Source>request.header.Authorization</Source> </BasicAuthentication>
このポリシー サンプルでは、Authorization
HTTP ヘッダーのユーザー名とパスワードが <Source> 要素で指定されたとおりにデコードされます。Base64 でエンコードされた文字列は、Basic Base64EncodedString.
という形式である必要があります。
このポリシーでは、デコードされたユーザー名は request.header.username 変数、デコードされたパスワードは request.header.password 変数にそれぞれ書き込まれます。
Basic Authentication ポリシーについて
このポリシーには次の 2 つの操作モードがあります。
- エンコード: 変数に格納されているユーザー名とパスワードを Base64 でエンコードします。
- デコード: Base64 でエンコードされた文字列からユーザー名とパスワードをデコードします。
一般に、ユーザー名とパスワードは Key-Value ストアに格納され、ランタイムにその Key-Value ストアから読み取られます。Key-Value ストアの使用について詳しくは、Key Value Map Operations ポリシーをご覧ください。
要素リファレンス
この要素リファレンスは、BasicAuthentication ポリシーの要素と属性について説明します。
<BasicAuthentication async="false" continueOnError="false" enabled="true" name="Basic-Authentication-1"> <DisplayName>Basic Authentication 1</DisplayName> <Operation>Encode</Operation> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <User ref="request.queryparam.username" /> <Password ref="request.queryparam.password" /> <AssignTo createNew="false">request.header.Authorization</AssignTo> <Source>request.header.Authorization</Source> </BasicAuthentication>
<BasicAuthentication> 属性
<BasicAuthentication async="false" continueOnError="false" enabled="true" name="Basic-Authentication-1">
次の表に、すべてのポリシーの親要素に共通する属性を示します。
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name |
ポリシーの内部名。 管理 UI プロキシ エディタで |
なし | 必須 |
continueOnError |
ポリシーが失敗した場合にエラーを返すには、 ポリシーが失敗した後もフローの実行を続行する場合は、 |
false | 省略可 |
enabled |
ポリシーを適用するには、 ポリシーを無効にするには、 |
true | 省略可 |
async |
この属性は非推奨となりました。 |
false | 非推奨 |
<DisplayName> 要素
管理 UI プロキシ エディタで name
属性と一緒に使用して、ポリシーのラベルに使用する自然言語名を指定します。
<DisplayName>Policy Display Name</DisplayName>
デフォルト |
なし この要素を省略した場合、ポリシーの |
---|---|
要否 | 省略可 |
タイプ | 文字列 |
<Operation> 要素
認証情報を Base64 エンコードまたは Base64 デコードするかどうかを指定します。
<Operation>Encode</Operation>
デフォルト: | なし |
要否: | 必須 |
型: |
文字列 有効な値は次のとおりです。
|
<IgnoreUnresolvedVariables> 要素
true
に設定すると、変数を解決できない場合でもポリシーはエラーを返しません。BasicAuthentication ポリシーのコンテキストで使用される場合、この値は通常、指定された変数にユーザー名またはパスワードが格納されていない場合にエラーを返すために、false
に設定されます。
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
デフォルト: | true |
要否: | 省略可 |
型: |
ブール値 |
<User> 要素
- エンコードの場合は、
<User>
要素を使用してユーザー名を含む変数を指定します。ユーザー名とパスワードの値は、コロンで連結されてから、Base64 でエンコードされます。 - デコードの場合は、デコードされたユーザー名が書き込まれる変数を指定します。
<User ref="request.queryparam.username" />
デフォルト: | なし |
要否: | 必須 |
型: |
なし |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
ref |
ポリシーが動的にユーザー名を読み取る(エンコードの場合)またはユーザー名を書き込む(デコードの場合)変数。 |
なし | 必須 |
<Password> 要素
- エンコードの場合は、
<Password>
要素を使用してパスワードを含む変数を指定します。 - デコードの場合は、デコードされたパスワードが書き込まれる変数を指定します。
<Password ref="request.queryparam.password" />
デフォルト: | なし |
要否: | 必須 |
型: |
なし |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
ref |
ポリシーが動的にパスワードを読み取る(エンコードの場合)またはパスワードを書き込む(デコードの場合)変数。 |
なし | 必須 |
<AssignTo> 要素
このポリシーで生成されたエンコード値またはデコード値を設定する際のターゲットの変数を指定します。
次の例は、ポリシーによってメッセージの Authorization
ヘッダーが生成された値に設定されることを示しています。
<AssignTo createNew="false">request.header.Authorization</AssignTo>
デフォルト: | なし |
要否: | 必須 |
型: |
文字列 |
属性
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
createNew | 変数がすでに設定されている場合に、その変数を上書きするかどうかを指定します。 「false」の場合、変数への割り当ては、変数が現在設定されていない(値が NULL)場合にのみ行われます。 「true」の場合は常に変数の割り当てが行われます。 通常、この値は「false」(デフォルト)に設定します。 |
false | 省略可 |
<Source> 要素
デコードの場合は、Base64 でエンコードされた文字列を含む変数(Basic
Base64EncodedString
)。たとえば、Authorization ヘッダーに対応して request.header.Authorization
を指定します。
<Source>request.header.Authorization</Source>
デフォルト: | なし |
要否: | デコード操作の場合は必須。 |
型: |
なし |
フロー変数
ポリシーが失敗した場合は、次のフロー変数が設定されます。
BasicAuthentication.{policy_name}.failed
(値は true)
エラー リファレンス
このセクションでは、このポリシーによってエラーがトリガーされたときに返される障害コードとエラー メッセージ、Edge によって設定される障害変数について説明します。これは、エラーに対処する障害ルールを作成するうえで重要な情報です。詳細については、ポリシーエラーについて知っておくべきことと障害の処理をご覧ください。
ランタイム エラー
このエラーは、ポリシーの実行時に発生することがあります。
障害コード | HTTP ステータス | 原因 | 修正 |
---|---|---|---|
steps.basicauthentication.InvalidBasicAuthenticationSource |
500 | デコードで、Base64 エンコードされた文字列に有効な値が含まれていない場合、またはヘッダーの形式が正しくない場合(たとえば、「Basic」で始まっていない場合)。 | build |
steps.basicauthentication.UnresolvedVariable |
500 | デコードまたはエンコードに必要なソース変数が存在しません。このエラーは、IgnoreUnresolvedVariables が false の場合にのみ発生する可能性があります。 |
build |
デプロイエラー
以下のエラーは、このポリシーを含むプロキシをデプロイするときに発生することがあります。
エラー名 | 発生条件 | 修正 |
---|---|---|
UserNameRequired |
名前付きオペレーションに <User> 要素が存在する必要があります。 |
build |
PasswordRequired |
名前付きオペレーションに <Password> 要素が存在する必要があります。 |
build |
AssignToRequired |
名前付きオペレーションに <AssignTo> 要素が存在する必要があります。 |
build |
SourceRequired |
名前付きオペレーションに <Source> 要素が存在する必要があります。 |
build |
障害変数
ランタイム エラーが発生すると、次の変数が設定されます。詳細については、ポリシーエラーについて知っておくべきことをご覧ください。
変数 | 説明 | 例 |
---|---|---|
fault.name="fault_name" |
fault_name は、上記のランタイム エラーの表に記載されている障害の名前です。障害名は、障害コードの最後の部分です。 | fault.name Matches "UnresolvedVariable" |
BasicAuthentication.policy_name.failed |
policy_name は、障害が発生したポリシーのユーザー指定の名前です。 | BasicAuthentication.BA-Authenticate.failed = true |
エラー レスポンスの例
{ "fault":{ "detail":{ "errorcode":"steps.basicauthentication.UnresolvedVariable" }, "faultstring":"Unresolved variable : request.queryparam.password" } }
障害ルールの例
<FaultRule name="Basic Authentication Faults"> <Step> <Name>AM-UnresolvedVariable</Name> <Condition>(fault.name Matches "UnresolvedVariable") </Condition> </Step> <Step> <Name>AM-AuthFailedResponse</Name> <Condition>(fault.name = "InvalidBasicAuthenticationSource")</Condition> </Step> <Condition>(BasicAuthentication.BA-Authentication.failed = true) </Condition> </FaultRule>