Azure Fluid Relay token contract

Requests sent to Azure Fluid Relay should contain a JWT token in the authorization header. This token should be signed by the tenant key.

Claims

JWTs (JSON Web Tokens) are split into three parts:

  • Header - Provides information about how to validate the token, including information about the type of token and how it was signed.
  • Payload - Contains all the important data about the user or app that is attempting to call your service.
  • Signature - Is the raw material used to validate the token.

Each part is separated by a period (.) and separately Base64 encoded.

Header claims

Claim Format Description
alg string The algorithm used to sign the token. For example, "HS256"
typ string This value should always be “JWT.”

Payload claims

Claim Format Description
documentId string Generated by Azure Fluid Relay (AFR) service. Identifies the document for which the token is being generated.
scope string[] Identifies the permissions required by the client on the document or summary. For every scope, you can define the permissions you want to give to the client.
tenantId string Identifies the tenant.
user JSON Identifies users of your application. It can be used by your application to identify your users by using the Fluid Framework Audience.
{ id: <user_id>, name: <user_name>, additionalDetails: { email: <email>, date: <date>, }, }
iat number, a UNIX timestamp "Issued At" indicates when the authentication for this token occurred.
exp number, a UNIX timestamp The "exp" (expiration time) claim identifies the expiration time on or after which the JWT must not be accepted for processing. The token lifetime can't be more than 1 hour.
ver string Indicates the version of the access token. Must be 1.0 .
jti string Optional. The "jti" (JWT ID) claim provides a unique identifier for the JWT. The identifier value MUST be assigned in a manner that ensures that there is a negligible probability that the same value will be accidentally assigned to a different data object. We encourage you to use this claim to avoid failures due to usage of same token for document creation.

A sample Azure Fluid Relay token

{ 
  "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] 

How can you generate an Azure Fluid Relay token?

You can use the jsonwebtoken npm package and sign your token using this method.

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>");
    }