Azure Fluid Relay トークン コントラクト

Azure Fluid Relay に送信される要求には、Authorization ヘッダーに JWT トークンが含まれている必要があります。 このトークンには、テナント キーによる署名が必要です。

要求

JWT (JSON Web Token) は、次の 3 つの部分に分かれています。

  • ヘッダー - トークンの種類や署名方法に関する情報など、トークンの検証方法に関する情報が提供されます。
  • ペイロード - サービスを呼び出そうとしているユーザーまたはアプリに関する重要なデータがすべて含まれています。
  • 署名 - トークンの検証に使用される原材料です。

各部分はピリオド (.) で区切られ、Base64 で個別にエンコードされます。

ヘッダーのクレーム

要求 フォーマット 説明
alg string トークンの署名に使用されるアルゴリズム。 たとえば、"HS256"
typ string この値は常に "JWT" である必要があります。

ペイロードのクレーム

要求 フォーマット 説明
documentId string Azure Fluid Relay (AFR) サービスによって生成されます。 トークンが生成されているドキュメントを識別します。
scope string[] クライアントに必要な、ドキュメントまたは概要に対するアクセス許可を識別します。 すべてのスコープについて、クライアントに付与するアクセス許可を定義できます。
tenantId string テナントを識別します。
ユーザー JSON アプリケーションのユーザーを識別します。 Fluid Framework Audience を使用して、アプリケーションでユーザーを識別するために使用できます。
{ id: <user_id>, name: <user_name>, additionalDetails: { email: <email>, date: <date>, }, }
iat 数字、UNIX タイムスタンプ "Issued At" は、このトークンの認証がいつ行われたのかを示します。
exp 数字、UNIX タイムスタンプ "exp" (有効期限) 要求は、それ以降 JWT の処理を受け入れることができなくなる時刻を指定します。 トークンの有効期間は 1 時間を超えることはできません。
ver string アクセス トークンのバージョンを示します。 1.0 である必要があります。
jti string 省略可能。 "jti" (JWT ID) 要求は、JWT の一意の識別子を提供します。 識別子の値は、同じ値が誤って別のデータ オブジェクトに割り当てられるおそれがほとんどないように割り当てる必要があります。 ドキュメントの作成に同じトークンを使用することによる失敗を回避するために、このクレームを使用することをお勧めします。

Azure Fluid Relay トークンのサンプル

{ 
  "alg": "HS256",  
  "typ": "JWT" 
}.{ 
  "documentId": "746c4a6f-f778-4970-83cd-9e21bf88326c", 
  "scopes": [ "doc:read", "doc:write", "summary:write" ],   
  "iat": 1599098963,  
  "exp": 1599098963,  
  "tenantId": "AzureFluidTenantId",  
  "ver": "1.0",
  "jti": "d7cd6602-2179-11ec-9621-0242ac130002"
}.[Signature] 

Azure Fluid Relay トークンを生成する方法

jsonwebtoken npm パッケージを使用でき、このメソッドを使用してトークンに署名できます。

export function getSignedToken(
    tenantId: string,
    documentId: string,
    tokenLifetime: number = 60 * 60,
    ver: string = "1.0") {
        jwt.sign(
            {
                documentId, 
                user: {
                    displayName: "displayName", 
                    id: "userId", 
                    name: "userName" 
                }, 
                scopes: ["doc:read", "doc:write", "summary:write"], 
                iat: Math.round((new Date()).getTime() / 1000), 
                exp: Math.round((new Date()).getTime() / 1000) + tokenLifetime, //set the expiry date based on your needs but max-limit is one hour.
                tenantId, 
                ver,
                jti: uuid(), 
            },
            "<tenant_key>");
    }