Azure Functions에 대한 SignalR Service 입력 바인딩

클라이언트가 Azure SignalR Service에 연결하려면 먼저 서비스 엔드포인트 URL 및 유효한 액세스 토큰을 검색해야 합니다. SignalR커넥트ionInfo 입력 바인딩은 SignalR Service 엔드포인트 URL 및 서비스에 연결하는 데 사용되는 유효한 토큰을 생성합니다. 토큰은 시간이 제한되어 있으며 특정 사용자를 연결에 인증하는 데 사용할 수 있습니다. 따라서 토큰을 캐시하거나 클라이언트 간에 공유해서는 안 됩니다. 일반적으로 클라이언트가 연결 정보를 검색할 수 있도록 HTTP 트리거와 함께 SignalRConnectionInfo를 사용합니다.

이 바인딩을 사용하여 SignalR 클라이언트 SDK와 호환되는 "협상" 함수를 만드는 방법에 대한 자세한 내용은 Azure SignalR Service를 사용한 Azure Functions 개발 및 구성을 참조하세요. 설정 및 구성 세부 정보에 대한 자세한 내용은 개요를 참조하세요.

예시

C# 함수는 다음 C# 모드 중 하나를 사용하여 만들 수 있습니다.

  • 격리된 작업자 모델: 런타임에서 격리된 작업자 프로세스에서 실행되는 컴파일된 C# 함수입니다. LTS 및 비 LTS 버전 .NET 및 .NET Framework에서 실행되는 C# 함수를 지원하려면 격리된 작업자 프로세스가 필요합니다.
  • In Process 모델: Functions 런타임과 동일한 프로세스에서 실행되는 컴파일된 C# 함수입니다.
  • C# 스크립트: Azure Portal에서 C# 함수를 만들 때 주로 사용됩니다.

다음 예제에서는 입력 바인딩을 사용하여 SignalR 연결 정보를 획득하고 HTTP를 통해 해당 정보를 반환하는 C# 함수를 보여줍니다.

[Function(nameof(Negotiate))]
public static string Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
    [SignalRConnectionInfoInput(HubName = "serverless")] string connectionInfo)
{
    // The serialization of the connection info object is done by the framework. It should be camel case. The SignalR client respects the camel case response only.
    return connectionInfo;
}

다음 예제에서는 function.json 파일의 SignalR 연결 정보 입력 바인딩 및 바인딩을 사용하여 연결 정보를 반환하는 함수를 보여줍니다.

다음은 function.json 파일의 예에 대한 바인딩 데이터입니다.

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "hubName1",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

JavaScript 코드는 다음과 같습니다.

const { app, input } = require('@azure/functions');

const inputSignalR = input.generic({
    type: 'signalRConnectionInfo',
    name: 'connectionInfo',
    hubName: 'hubName1',
    connectionStringSetting: 'AzureSignalRConnectionString',
});

app.post('negotiate', {
    authLevel: 'function',
    handler: (request, context) => {
        return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) }
    },
    route: 'negotiate',
    extraInputs: [inputSignalR],
});

완전한 PowerShell 예제가 보류 중입니다.

다음 예제에서는 function.json 파일의 SignalR 연결 정보 입력 바인딩과 바인딩을 사용하여 연결 정보를 반환하는 Python 함수를 보여 줍니다.

Python 코드는 다음과 같습니다.

def main(req: func.HttpRequest, connectionInfoJson: str) -> func.HttpResponse:
    return func.HttpResponse(
        connectionInfoJson,
        status_code=200,
        headers={
            'Content-type': 'application/json'
        }
    )

다음 예시에서는 입력 바인딩을 사용하여 SignalR 연결 정보를 획득하고 HTTP를 통해 해당 정보를 반환하는 Java 함수를 보여줍니다.

@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
        @SignalRConnectionInfoInput(
            name = "connectionInfo",
            HubName = "hubName1") SignalRConnectionInfo connectionInfo) {
    return connectionInfo;
}

사용

인증된 토큰

인증된 클라이언트에서 함수를 트리거하면 생성된 토큰에 사용자 ID 클레임을 추가할 수 있습니다. App Service 인증을 사용하여 함수 앱에 인증을 쉽게 추가할 수 있습니다.

App Service 인증은 x-ms-client-principal-id라는 HTTP 헤더 및 인증된 사용자의 클라이언트 보안 주체 ID 및 이름 각각을 포함하는 x-ms-client-principal-name을 설정합니다.

바인딩 식을 사용하여 바인딩의 UserId 속성을 {headers.x-ms-client-principal-id} 또는 {headers.x-ms-client-principal-name} 헤더 중 하나의 값으로 설정할 수 있습니다.

[Function("Negotiate")]
public static string Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
    [SignalRConnectionInfoInput(HubName = "hubName1", UserId = "{headers.x-ms-client-principal-id}")] string connectionInfo)
{
    // The serialization of the connection info object is done by the framework. It should be camel case. The SignalR client respects the camel case response only.
    return connectionInfo;
}
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST, HttpMethod.GET },
            authLevel = AuthorizationLevel.ANONYMOUS)
            HttpRequestMessage<Optional<String>> req,
        @SignalRConnectionInfoInput(name = "connectionInfo", hubName = "hubName1", userId = "{headers.x-ms-signalr-userid}") SignalRConnectionInfo connectionInfo) {
    return connectionInfo;
}

function.json 파일의 바인딩 데이터는 다음과 같습니다.

{
    "type": "signalRConnectionInfo",
    "name": "connectionInfo",
    "hubName": "hubName1",
    "userId": "{headers.x-ms-client-principal-id}",
    "connectionStringSetting": "<name of setting containing SignalR Service connection string>",
    "direction": "in"
}

JavaScript 코드는 다음과 같습니다.

const { app, input } = require('@azure/functions');

const inputSignalR = input.generic({
    type: 'signalRConnectionInfo',
    name: 'connectionInfo',
    hubName: 'hubName1',
    connectionStringSetting: 'AzureSignalRConnectionString',
    userId: '{headers.x-ms-client-principal-id}',
});

app.post('negotiate', {
    authLevel: 'function',
    handler: (request, context) => {
        return { body: JSON.stringify(context.extraInputs.get(inputSignalR)) }
    },
    route: 'negotiate',
    extraInputs: [inputSignalR],
});

완전한 PowerShell 예제가 보류 중입니다.

Python 코드는 다음과 같습니다.

def main(req: func.HttpRequest, connectionInfo: str) -> func.HttpResponse:
    # connectionInfo contains an access key token with a name identifier
    # claim set to the authenticated user
    return func.HttpResponse(
        connectionInfo,
        status_code=200,
        headers={
            'Content-type': 'application/json'
        }
    )
@FunctionName("negotiate")
public SignalRConnectionInfo negotiate(
        @HttpTrigger(
            name = "req",
            methods = { HttpMethod.POST },
            authLevel = AuthorizationLevel.ANONYMOUS) HttpRequestMessage<Optional<String>> req,
        @SignalRConnectionInfoInput(
            name = "connectionInfo",
            HubName = "hubName1",
            userId = "{headers.x-ms-client-principal-id}") SignalRConnectionInfo connectionInfo) {
    return connectionInfo;
}

특성

In Process격리된 작업자 프로세스 C# 라이브러리는 모두 특성을 사용하여 함수를 정의합니다. C# 스크립트는 대신 function.json 구성 파일을 사용합니다.

다음 표에서는 SignalRConnectionInfoInput 특성의 속성을 설명합니다.

특성 속성 설명
HubName 필수입니다. 허브 이름입니다.
ConnectionStringSetting SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString)입니다.
UserId 선택 사항. SignalR 연결의 사용자 식별자입니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다.
IdToken 선택 사항. 클레임이 사용자 클레임에 추가되는 JWT 토큰입니다. ClaimTypeList와 함께 사용해야 합니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다.
ClaimTypeList 선택 사항. IdToken에서 클레임을 필터링하는 클레임 유형 목록입니다.

주석

다음 표에서는 SignalRConnectionInfoInput 주석에 대해 지원되는 설정을 설명합니다.

설정 Description
이름 연결 정보 개체에 대한 함수 코드에 사용되는 변수 이름입니다.
hubName 필수입니다. 허브 이름입니다.
connectionStringSetting SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString)입니다.
userId 선택 사항. SignalR 연결의 사용자 식별자입니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다.
idToken 선택 사항. 클레임이 사용자 클레임에 추가되는 JWT 토큰입니다. claimTypeList와 함께 사용해야 합니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다.
claimTypeList 선택 사항. idToken에서 클레임을 필터링하는 클레임 유형 목록입니다.

주석

다음 표에서는 SignalRConnectionInfoInput 주석에 대해 지원되는 설정을 설명합니다.

설정 Description
이름 연결 정보 개체에 대한 함수 코드에 사용되는 변수 이름입니다.
hubName 필수입니다. 허브 이름입니다.
connectionStringSetting SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString)입니다.
userId 선택 사항. SignalR 연결의 사용자 식별자입니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다.
idToken 선택 사항. 클레임이 사용자 클레임에 추가되는 JWT 토큰입니다. claimTypeList와 함께 사용해야 합니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다.
claimTypeList 선택 사항. idToken에서 클레임을 필터링하는 클레임 유형 목록입니다.

구성

다음 표에서는 function.json 파일에 설정된 바인딩 구성 속성을 설명합니다.

function.json 속성 설명
type signalRConnectionInfo로 설정해야 합니다.
direction in로 설정해야 합니다.
hubName 필수입니다. 허브 이름입니다.
connectionStringSetting SignalR Service 연결 문자열이 포함된 앱 설정의 이름(기본값은 AzureSignalRConnectionString)입니다.
userId 선택 사항. SignalR 연결의 사용자 식별자입니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다.
idToken 선택 사항. 클레임이 사용자 클레임에 추가되는 JWT 토큰입니다. claimTypeList와 함께 사용해야 합니다. 바인딩 식을 사용하여 값을 HTTP 요청 헤더 또는 쿼리에 바인딩할 수 있습니다.
claimTypeList 선택 사항. idToken에서 클레임을 필터링하는 클레임 유형 목록입니다.

HTTP 트리거에 대한 바인딩 식

SignalR 입력 바인딩의 일부 특성 값은 HTTP 요청에서 오는 것이 일반적인 시나리오입니다. 따라서 바인딩 식을 통해 HTTP 요청의 값을 SignalR 입력 바인딩 특성에 바인딩하는 방법을 보여 줍니다.

HTTP 메타데이터 형식 바인딩 식 형식 설명 예시
HTTP 요청 쿼리 {query.QUERY_PARAMETER_NAME} 해당 쿼리 매개 변수의 값을 특성에 바인딩합니다. {query.userName}
HTTP 요청 헤더 {headers.HEADER_NAME} 헤더 값을 특성에 바인딩합니다. {headers.token}

다음 단계