HTTP認証
EMQXは外部HTTPサービスを通じたパスワード認証をサポートしています。クライアントが接続すると、EMQXはクライアント情報を用いてHTTPリクエストを構築し、リクエストの返却内容に基づいて認証結果を判定します。これにより、複雑な認証および認可ロジックを実現できます。
注意
HTTP認証はEMQXサーバレスのデプロイメントではサポートされていません。
HTTP認証の仕組み
認証プロセスはHTTP APIコールに類似しており、EMQXはリクエストクライアントとして「API」で要求される形式のリクエストを構築し、HTTPサービスに対して発行します。HTTPサービスは「クライアント」の要件に従い、以下の内容を返す必要があります。
- レスポンスのContent-Typeは
application/jsonであること。 - 認証結果はボディ内の
resultで示し、allow、deny、ignoreのいずれかを返します。 - スーパーユーザーの状態はボディ内の
is_superuserフラグで示し、trueまたはfalseを設定できます。trueに設定された場合、そのユーザー名を使用するクライアントは認可制約を受けません。スーパーユーザーの設定は推奨されません。 - HTTPレスポンスのステータスコードは
200または204である必要があります。4xx/5xxのステータスコードの場合、ボディは無視され、結果はignoreとして扱われ、認証チェーンが継続されます。
レスポンス例:
json
HTTP/1.1 200 OK
Headers: Content-Type: application/json
...
Body:
{
"result": "allow", // "allow" | "deny" | "ignore"
"is_superuser": true, // オプション: true | false、デフォルト値: false
"client_attrs": { // オプション(v5.7.0以降)
"role": "admin",
"sn": "10c61f1a1f47"
}
}HTTP認証の設定
デプロイメント画面で、アクセス制御 -> 認証 -> 拡張認証をクリックし、HTTP認証を選択して設定をクリックします。
EMQX Cloudは現在のクライアント情報を用いて、ユーザーが設定した認証クエリリクエストを構築・発行し、HTTPサーバー側でクライアントの認証情報を照会します。
以下の設定を行えます。
メソッド:HTTPリクエストメソッドを選択します。選択肢は
get、postです。TIP
POSTメソッドの使用を推奨します。GETメソッドはHTTPサーバーログに平文パスワードなどの機密情報が記録される恐れがあります。また、信頼できない環境ではHTTPSを使用してください。URL:HTTPサービスのURLアドレスを入力します。
TIP
- Dedicated Flexデプロイメントの場合はVPCピアリング接続を作成し、サーバーアドレスとして内部ネットワークアドレスを使用してください。
- BYOCデプロイメントの場合はパブリッククラウドコンソールでVPCピアリング接続を作成します。詳細はCreate VPC Peering Connectionsを参照してください。サーバーアドレスとして内部ネットワークアドレスを使用してください。
- 「Init resource failure!」というメッセージが表示された場合は、サーバーアドレスの正確性とセキュリティグループのアクセス許可を確認してください。
- URLは
http://またはhttps://で始まる必要があります。 - ドメイン名にプレースホルダーを使用しないでください。
- URLパス内で以下のプレースホルダーを使用可能です。
${clientid}${username}${password}${peerhost}${cert_subject}${cert_common_name}
ヘッダー(任意):HTTPリクエストヘッダーの設定。複数のヘッダーを追加可能です。
接続設定:同時接続数、接続タイムアウト、最大HTTPリクエスト数、リクエストタイムアウト時間を設定します。
- TLSを有効化:TLSを有効にするかどうかを設定します。
- 接続プールサイズ(任意):EMQXノードから外部HTTPサーバーへの同時接続数を整数で指定します。デフォルト値は
8です。 - 接続タイムアウト(任意):接続タイムアウト時間を秒単位で入力します。
- HTTPパイプライン(任意):レスポンスを待たずに送信可能な最大HTTPリクエスト数を正の整数で指定します。デフォルト値は
100です。 - リクエストタイムアウト(任意):リクエストのタイムアウト時間を入力します。単位は時間、分、秒、ミリ秒が使用可能です。
- ボディ:リクエストテンプレートです。
POSTリクエストの場合はJSON形式でリクエストボディに送信されます。GETリクエストの場合はURLのクエリパラメータとしてエンコードされます。マッピングのキーと値にはプレースホルダーを使用可能です。リクエストボディで使用可能なプレースホルダーは以下の通りです。${clientid}:実行時にクライアントIDに置き換えられます。クライアントIDは通常、クライアントがCONNECTパケットで明示的に指定します。${username}:実行時にユーザー名に置き換えられます。ユーザー名はCONNECTパケットのUsernameフィールドから取得されます。${password}:実行時にパスワードに置き換えられます。パスワードはCONNECTパケットのPasswordフィールドから取得されます。${client_attrs.<attribute>}:クライアント属性です。<attribute>は事前定義された設定に基づき、実行時に属性名に置き換えられます。