Skip to content

HTTP認証

EMQXは外部HTTPサービスを通じたパスワード認証をサポートしています。クライアントが接続すると、EMQXはクライアント情報を用いてHTTPリクエストを構築し、リクエストの返却内容に基づいて認証結果を判定します。これにより、複雑な認証および認可ロジックを実現できます。

注意

HTTP認証はEMQXサーバレスのデプロイメントではサポートされていません。

HTTP認証の仕組み

認証プロセスはHTTP APIコールに類似しており、EMQXはリクエストクライアントとして「API」で要求される形式のリクエストを構築し、HTTPサービスに対して発行します。HTTPサービスは「クライアント」の要件に従い、以下の内容を返す必要があります。

  • レスポンスのContent-Typeはapplication/jsonであること。
  • 認証結果はボディ内のresultで示し、allowdenyignoreのいずれかを返します。
  • スーパーユーザーの状態はボディ内の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リクエストメソッドを選択します。選択肢はgetpostです。

    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>は事前定義された設定に基づき、実行時に属性名に置き換えられます。