コンテンツにスキップ

認証と認可

Pub/Subは2つの認証モードをサポートしています。ブローカーは1つまたは両方を許可することがありますが、認証は常に必要なため、どちらも許可しないことはありません。

モード詳細
TOKENCONNECTパケット内でクライアントIDとパスワード(署名されたJSON Webトークンで表される)を受け入れます。MQTTユーザー名フィールドはオプションです。提供された場合、クライアントIDと一致する必要があります。
MTLSまだサポートされていません。 そのブローカーにスコープされたmTLSキーペア(TLSクライアント資格情報)を受け入れます。キーペアは、特に設定されていない限り、CloudflareのルートCAから発行されます。
MTLS_AND_TOKENまだサポートされていません。 クライアントがブローカーに対してMTLSおよび/またはトークン認証の両方を使用できるようにします。

特定のブローカーにスコープされた資格情報を生成するには、2つのオプションがあります:

  • Pub/SubにクライアントIDを生成させる。
  • Pub/Subがトークンを生成するために使用するクライアントIDのリストを提供する。

ゼロから始める場合の推奨かつ最も簡単なアプローチは、Pub/SubにクライアントIDを生成させることで、これにより十分にランダムであり、競合するクライアントIDがないことが保証されます。重複したクライアントIDは、クライアントに問題を引き起こす可能性があります。なぜなら、クライアントIDのインスタンスは1つだけがブローカーに接続できるからです。

資格情報の生成

your-namespace内のexample-brokerという名前のブローカーのために単一のトークンを生成するには、Pub/Sub APIにリクエストを発行します。

  • デフォルトでは、APIは1つの有効な<Client ID, Token>ペアを返しますが、大規模な展開のために1回のAPI呼び出しで最大100を返すことができます。
  • トークンのためにトピックACL(アクセス制御リスト)を指定する必要があります。これは、これらのトークンで認証されたクライアントがPUBLISHまたはSUBSCRIBEできるトピックを定義します。現在、トピックACLは#(すべてのトピック)でなければなりません — より細かいACLはまだサポートされていません。

たとえば、自動生成されたクライアントIDを持つ5つの有効なトークンを生成するには:

Terminal window
wrangler pubsub broker issue example-broker --number=5 --expiration=48h

以下の例に似た成功レスポンスを受け取るはずです。これはクライアントIDとその関連トークンのマップです。

{
"01G3A5GBJE5P3GPXJZ72X4X8SA": "eyJhbGciOiJFZERTQSIsImtpZCI6IkpEUHVZSnFIT3Zxemxha2tORlE5a2ZON1dzWXM1dUhuZHBfemlSZG1PQ1UifQ.
not-a-real-token.ZZL7PNittVwJOeMpFMn2CnVTgIz4AcaWXP9NqMQK0D_iavcRv_p2DVshg6FPe5xCdlhIzbatT6gMyjMrOA2wBg",
"01G3A5GBJECX5DX47P9RV1C5TV": "eyJhbGciOiJFZERTQSIsImtpZCI6IkpEUHVZSnFIT3Zxemxha2tORlE5a2ZON1dzWXM1dUhuZHBfemlSZG1PQ1UifQ.also-not-a-real-token.WrhK-VTs_IzOEALB-T958OojHK5AjYBC5ZT9xiI_6ekdQrKz2kSPGnvZdUXUsTVFDf9Kce1Smh-mw1sF2rSQAQ",
}

クライアントの設定

Pub/Subに接続するためにMQTTクライアントを設定するには、次のものが必要です:

  • ブローカーのホスト名 - 例:your-broker.your-namespace.cloudflarepubsub.com とポート(MQTTの場合は8883
  • クライアントID - これはトークンに関連付けられたクライアントIDである必要があります、または空のままにします。一部のクライアントはクライアントIDを必要とし、他のクライアントはランダムなクライアントIDを生成します。クライアントIDが不一致の場合、接続できません
  • ユーザー名 - Pub/Subはユーザー名を指定する必要はありません。これを空のままにするか、ユーザー名を設定する必要があるクライアントには、通常PubSubというテキストで十分です。
  • “パスワード” - これはAPIから受け取った有効なJSON Webトークン(JWT)で、接続しようとしているブローカーに特有のものです

最も一般的な失敗ケースは、トークンと一致しないクライアントIDを提供することです。クライアントでこれを正しく設定していることを確認するか、(推奨)クライアントがPub/Subに接続するときにクライアントIDを自動的に割り当てることをサポートしている場合は空のままにしてください。

トークンのクレームとメタデータ

Pub/Subによって発行されたJSON Webトークン(JWT)には、次のクレームが含まれます。

クレーム詳細
iatトークンの作成時間を表すUnixタイムスタンプ。
expトークンの有効期限を表すUnixタイムスタンプ。オプションの有効期限タイムスタンプがある場合のみ含まれます。
sub”サブジェクト” - このトークンに関連付けられたMQTTクライアント識別子。これはクライアントIDの真実の源です。CONNECTパケットにクライアントIDが提供されている場合、これと一致する必要があります。CONNECTパケットでクライアントIDを指定しないクライアントは、接続時にCONNACKパケット内でこのクライアントIDを”割り当てられたクライアント識別子”として見ることになります。
jtiJWT ID。このJWTを一意に識別する識別子。特定のトークンを区別するために使用され、特定のトークンの取り消しを可能にします。
topicAcl#(すべてのトピックに一致)でなければなりません。将来的には、ACLを使用してクライアントがPUBLISHまたはSUBSCRIBEできるトピックを表現できるようになります。

資格情報の取り消し

資格情報を取り消すには、それを即座に無効にし、クライアントがそれを使用して接続できないようにするには、wrangler pubsub broker revoke [...]を使用するか、Pub/Sub APIの/revocationsエンドポイントにPOSTリクエストを発行し、jti(ユニークトークン識別子)を指定します。

これにより、トークンが取り消しリストに追加されます。JWTを使用する場合、ユニークなjtiクレームに基づいてJWTを取り消すことができます。複数のトークンを一度に取り消すには、トークン識別子のリストを提供します。

Terminal window
wrangler pubsub broker revoke example-broker --namespace=NAMESPACE_NAME --jti=JTI_ONE --jti=JTI_TWO

現在取り消されたすべてのトークンをリストするには、wrangler pubsub broker show-revocations [...]を使用するか、/revocationsエンドポイントにGETリクエストを行います。

トークンを_取り消し解除_するには、wrangler pubsub broker unrevoke [...]を使用するか、jtiをクエリパラメータとして指定して/revocationsエンドポイントにDELETEリクエストを発行します。

資格情報の有効期限と期限切れ

資格情報は、すべての資格情報に適用されるブローカー単位での有効期限を設定することができ、または資格情報単位での有効期限を設定することができます。

  • デフォルトでは、資格情報は期限切れにならず、資格情報管理を簡素化します。
  • 資格情報は、ブローカーと発行された資格情報の両方に有効期限が設定されている場合、最も短い有効期限を継承します。

資格情報を要求する際にexpiration値を設定することで、発行された各セットの資格情報に有効期限を設定できます。この場合、1日(1d)を指定します:

Terminal window
wrangler pubsub broker issue example-broker --namespace=NAMESPACE_NAME --expiration=1d

これにより、発行から1日(24時間)後に期限切れになるトークンが返されます:

{
"01G3A5GBJE5P3GPXJZ72X4X8SA": "eyJhbGciOiJFZERTQSIsImtpZCI6IkpEUHVZSnFIT3Zxemxha2tORlE5a2ZON1dzWXM1dUhuZHBfemlSZG1PQ1UifQ.
not-a-real-token.ZZL7PNittVwJOeMpFMn2CnVTgIz4AcaWXP9NqMQK0D_iavcRv_p2DVshg6FPe5xCdlhIzbatT6gMyjMrOA2wBg"
}

既存のPub/Subブローカーに対してブローカー単位のグローバル有効期限を設定するには、ブローカーのexpirationフィールドを設定して、発行される資格情報が継承すべき秒数を指定します:

Terminal window
wrangler pubsub broker update YOUR_BROKER --namespace=NAMESPACE_NAME --expiration=7d

これにより、ブローカーによって発行されたトークンはデフォルトで7日間の有効期限を持つようになります。wrangler pubsub broker issue [...]--expirationフラグを渡すことで、これを_短く_することができます。たとえば:

  • ブローカー自体の有効期限よりも長い--expirationを設定した場合、ブローカーの有効期限が代わりに使用されます(最短が勝ちます)。
  • wrangler pubsub broker issue [...] --expiration -1を使用すると、トークンからexpクレームが削除され、実質的に期限切れのないトークンが返されます - たとえブローカー単位の有効期限が設定されていても。

ベストプラクティス

  • 各ブローカーの有効期限設定をexpiration(整数秒)フィールドを介して設定することを強く推奨します。これにより、exp JWTクレームを介してそのブローカーのために生成されたすべての資格情報に対して暗黙的に有効期限タイムスタンプが設定されます。
  • 短命の資格情報(たとえば、7日から30日)を使用し、自動ローテーションポリシーを持つことで、資格情報の漏洩リスクを減らし、事後に資格情報を積極的に取り消す必要を減らすことができます。
  • Pub/Sub自体を使用して、Cron Triggersや、クライアントがローカルトークンストアを更新するために使用できる別のHTTPエンドポイントを介してクライアントに新しい資格情報を発行することができます。

認可とアクセス制御

クライアントがPUBLISHまたはSUBSCRIBEできるトピックを制限するために、ACL(アクセス制御リスト)を定義できます。トピックACLは、クライアントに発行された署名付き資格情報に定義され、クライアントが接続する際に決定されます。