다음을 통해 공유


Azure Fluid Relay 토큰 계약

Azure Fluid Relay로 전송된 요청에는 인증 헤더에 JWT 토큰이 포함되어야 합니다. 이 토큰은 테넌트 키로 서명되어야 합니다.

클레임

JWT(JSON Web Token)는 세 부분으로 나뉩니다.

  • 헤더 - 토큰 유형과 서명 방법에 대한 정보를 포함하여 토큰의 유효성을 검사,하는 방법에 대한 정보를 제공합니다.
  • 페이로드 - 서비스를 호출하려고 하는 사용자 또는 앱에 대한 모든 중요 데이터가 포함되어 있습니다.
  • 서명 - 토큰의 유효성을 검사하는 데 사용되는 원시 자료입니다.

각 부분은 마침표(.)로 구분되며 별도로 Base64로 인코딩됩니다.

헤더 클레임

클레임 서식 설명
alg string 토큰 서명에 사용되는 알고리즘입니다. 예: "HS256"
typ string 이 값은 항상 "JWT"여야 합니다.

페이로드 클레임

클레임 서식 설명
documentId string AFR(Azure Fluid Relay) 서비스에서 생성됩니다. 토큰이 생성되는 문서를 식별합니다.
scope string[] 문서 또는 요약에서 클라이언트가 요구하는 권한을 식별합니다. 모든 범위에 대해 클라이언트에 부여할 권한을 정의할 수 있습니다.
tenantId string 테넌트를 식별합니다.
user JSON 애플리케이션의 사용자를 식별합니다. 애플리케이션에서 Fluid Framework 대상 그룹을 사용하여 사용자를 식별하는 데 사용할 수 있습니다.
{ id: <user_id>, name: <user_name>, additionalDetails: { email: <email>, date: <date>, }, }
iat 숫자, UNIX 타임스탬프 "발급 시"는 이 토큰에 대한 인증이 발생한 시기를 나타냅니다.
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>");
    }