Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Nasze rozszerzenie udostępnia dwa powiązania wejściowe przeznaczone dla różnych potrzeb.
-
Aby umożliwić klientowi nawiązanie połączenia z usługą Azure Web PubSub Service, musi on znać adres URL punktu końcowego usługi i prawidłowy token dostępu. Powiązanie
WebPubSubConnectionwejściowe generuje wymagane informacje, więc klient nie musi obsługiwać samego generowania tokenu. Token jest ograniczony czasowo i może uwierzytelnić określonego użytkownika w połączeniu. W związku z tym nie buforuj tokenu ani nie udostępniaj go między klientami. Wyzwalacz HTTP pracujący z tym powiązaniem wejściowym może służyć klientom do pobierania informacji o połączeniu. -
W przypadku korzystania z usługi Static Web Apps
HttpTriggerjest jedynym obsługiwanym wyzwalaczem. W scenariuszachWebPubSubContextWeb PubSub powiązanie wejściowe pomaga użytkownikom deserializować nadrzędne żądania HTTP z usługi w ramach protokołów Web PubSub. Dzięki temu klienci mogą uzyskać podobne wyniki w porównaniu doWebPubSubTriggerłatwego obsługi w funkcjach. W przypadku użycia zHttpTriggerprogramem klient musi odpowiednio skonfigurować adres URL uwidoczniony przez narzędzie HttpTrigger w procedurze obsługi zdarzeń.
WebPubSubConnection
Przykład
W poniższym przykładzie przedstawiono funkcję wyzwalacza HTTP, która uzyskuje informacje o połączeniu Web PubSub przy użyciu powiązania wejściowego i zwraca je za pośrednictwem protokołu HTTP. W poniższym przykładzie element UserId jest przekazywany za pośrednictwem części zapytania żądania klienta, takiej jak ?userid={User-A}.
[Function("WebPubSubConnectionInputBinding")]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
[WebPubSubConnectionInput(Hub = "<hub>", , UserId = "{query.userid}", Connection = "<web_pubsub_connection_name>")] WebPubSubConnection connectionInfo)
{
var response = req.CreateResponse(HttpStatusCode.OK);
response.WriteAsJsonAsync(connectionInfo);
return response;
}
const { app, input } = require('@azure/functions');
const connection = input.generic({
type: 'webPubSubConnection',
name: 'connection',
userId: '{query.userId}',
hub: '<hub>'
});
app.http('negotiate', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
extraInputs: [connection],
handler: async (request, context) => {
return { body: JSON.stringify(context.extraInputs.get('connection')) };
},
});
Utwórz folder negocjując i aktualizuj negocjując/function.json i kopiując następujące kody JSON.
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req"
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "webPubSubConnection",
"name": "connection",
"userId": "{query.userid}",
"hub": "<hub>",
"direction": "in"
}
]
}
Zdefiniuj funkcję w pliku negotiate/init.py.
import logging
import azure.functions as func
def main(req: func.HttpRequest, connection) -> func.HttpResponse:
return func.HttpResponse(connection)
Uwaga
Kompletne przykłady dla tego języka są oczekujące
Uwaga
Rozszerzenia Web PubSub dla języka Java nie są jeszcze obsługiwane.
Uzyskiwanie uwierzytelnioowanego identyfikatora użytkownika
Jeśli funkcja jest wyzwalana przez uwierzytelnionego klienta, możesz dodać oświadczenie identyfikatora użytkownika do wygenerowanego tokenu. Uwierzytelnianie można łatwo dodać do aplikacji funkcji przy użyciu uwierzytelniania usługi App Service.
Uwierzytelnianie usługi App Service ustawia nagłówki HTTP o nazwie x-ms-client-principal-id i x-ms-client-principal-name zawierają odpowiednio identyfikator jednostki klienta i nazwę uwierzytelnionego użytkownika.
Właściwość powiązania można ustawić UserId na wartość z nagłówka przy użyciu wyrażenia powiązania: {headers.x-ms-client-principal-id} lub {headers.x-ms-client-principal-name}.
[Function("WebPubSubConnectionInputBinding")]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req,
[WebPubSubConnectionInput(Hub = "<hub>", , UserId = "{headers.x-ms-client-principal-id}", Connection = "<web_pubsub_connection_name>")] WebPubSubConnection connectionInfo)
{
var response = req.CreateResponse(HttpStatusCode.OK);
response.WriteAsJsonAsync(connectionInfo);
return response;
}
const { app, input } = require('@azure/functions');
const connection = input.generic({
type: 'webPubSubConnection',
name: 'connection',
userId: '{headers.x-ms-client-principal-id}',
hub: '<hub>'
});
app.http('negotiate', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
extraInputs: [connection],
handler: async (request, context) => {
return { body: JSON.stringify(context.extraInputs.get('connection')) };
},
});
Utwórz folder negocjując i aktualizuj negocjując/function.json i kopiując następujące kody JSON.
{
"scriptFile": "__init__.py",
"bindings": [
{
"authLevel": "anonymous",
"type": "httpTrigger",
"direction": "in",
"name": "req"
},
{
"type": "http",
"direction": "out",
"name": "$return"
},
{
"type": "webPubSubConnection",
"name": "connection",
"userId": "{headers.x-ms-client-principal-id}",
"hub": "<hub>",
"direction": "in"
}
]
}
Zdefiniuj funkcję w pliku negotiate/init.py.
import logging
import azure.functions as func
def main(req: func.HttpRequest, connection) -> func.HttpResponse:
return func.HttpResponse(connection)
Uwaga
Kompletne przykłady dla tego języka są oczekujące
Uwaga
Rozszerzenia Web PubSub dla języka Java nie są jeszcze obsługiwane.
Konfigurowanie
W poniższej tabeli opisano właściwości konfiguracji powiązania ustawione w pliku function.json i atrybut.WebPubSubConnection
| właściwość function.json | Właściwość atrybutu | opis |
|---|---|---|
| typ | nie dotyczy | Musi być ustawiona na webPubSubConnection |
| kierunek | nie dotyczy | Musi być ustawiona na in |
| nazwa | nie dotyczy | Nazwa zmiennej używana w kodzie funkcji dla obiektu powiązania połączenia wejściowego. |
| koncentrator | Piasta | Wymagane — wartość musi być ustawiona na nazwę centrum Web PubSub, aby funkcja została wyzwolona. Obsługujemy ustawianie wartości w atrybucie jako wyższy priorytet lub można ją ustawić w ustawieniach aplikacji jako wartość globalną. |
| userId | Identyfikator użytkownika | Opcjonalnie — wartość oświadczenia identyfikatora użytkownika, która ma zostać ustawiona w tokenie klucza dostępu. |
| clientProtocol | ClientProtocol | Opcjonalnie — typ protokołu klienta. Prawidłowe wartości to default i mqtt. W przypadku klientów MQTT należy ustawić go na mqtt. W przypadku innych klientów można pominąć właściwość lub ustawić ją na default. |
| połączenie | Połączenie | Wymagane — nazwa ustawienia aplikacji zawierającego usługę Web PubSub Service parametry połączenia (domyślnie to "WebPubSubConnectionString"). |
Użycie
WebPubSubConnection udostępnia następujące właściwości.
| Nazwa powiązania | Typ powiązania | opis |
|---|---|---|
| Identyfikator BaseUri | Identyfikator URI | Identyfikator URI połączenia klienta web PubSub. |
| Identyfikator URI | Identyfikator URI | Bezwzględny identyfikator URI połączenia Web PubSub zawiera AccessToken wygenerowaną bazę na żądanie. |
| Token dostępu | ciąg |
AccessToken Generowane na podstawie identyfikatora UserId żądania i informacji o usłudze. |
WebPubSubConnection udostępnia następujące właściwości.
| Nazwa powiązania | opis |
|---|---|
| podstawowy URL | Identyfikator URI połączenia klienta web PubSub. |
| Adres URL | Bezwzględny identyfikator URI połączenia Web PubSub zawiera AccessToken wygenerowaną bazę na żądanie. |
| accessToken |
AccessToken Generowane na podstawie identyfikatora UserId żądania i informacji o usłudze. |
Uwaga
Rozszerzenia Web PubSub dla języka Java nie są jeszcze obsługiwane.
Więcej dostosowywania wygenerowanego tokenu
Ograniczone do typów parametrów powiązania nie obsługują sposobu przekazywania listy ani tablicy, WebPubSubConnection ale nie jest w pełni obsługiwany ze wszystkimi parametrami zestawu SDK serwera, zwłaszcza roles, a także zawiera groups i expiresAfter.
Gdy klient musi dodać role lub opóźnić tworzenie tokenu dostępu w funkcji, zalecamy pracę z zestawem SDK serwera dla języka C#.
[Function("WebPubSubConnectionCustomRoles")]
public static HttpResponseData Run([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequestData req)
{
var serviceClient = new WebPubSubServiceClient(new Uri(endpoint), "<hub>", "<web-pubsub-connection-string>");
var userId = req.Query["userid"].FirstOrDefault();
// your method to get custom roles.
var roles = GetRoles(userId);
var url = await serviceClient.GetClientAccessUriAsync(TimeSpan.FromMinutes(5), userId, roles);
var response = req.CreateResponse(HttpStatusCode.OK);
response.WriteString(url.ToString());
return response;
}
Gdy klient musi dodać role lub opóźnić tworzenie tokenu dostępu w funkcji, zalecamy pracę z zestawem SDK serwera dla języka JavaScript.
const { app } = require('@azure/functions');
const { WebPubSubServiceClient } = require('@azure/web-pubsub');
app.http('negotiate', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
handler: async (request, context) => {
const serviceClient = new WebPubSubServiceClient(process.env.WebPubSubConnectionString, "<hub>");
let token = await serviceClient.getAuthenticationToken({ userId: req.query.userid, roles: ["webpubsub.joinLeaveGroup", "webpubsub.sendToGroup"] });
return { body: token.url };
},
});
Uwaga
Kompletne przykłady dla tego języka są oczekujące
Uwaga
Rozszerzenia Web PubSub dla języka Java nie są jeszcze obsługiwane.
WebPubSubContext
Przykład
// validate method when upstream set as http://<func-host>/api/{event}
[Function("validate")]
public static HttpResponseData Validate(
[HttpTrigger(AuthorizationLevel.Anonymous, "options")] HttpRequestData req,
[WebPubSubContextInput] WebPubSubContext wpsReq)
{
return BuildHttpResponseData(req, wpsReq.Response);
}
// Respond AbuseProtection to put header correctly.
private static HttpResponseData BuildHttpResponseData(HttpRequestData request, SimpleResponse wpsResponse)
{
var response = request.CreateResponse();
response.StatusCode = (HttpStatusCode)wpsResponse.Status;
response.Body = response.Body;
foreach (var header in wpsResponse.Headers)
{
response.Headers.Add(header.Key, header.Value);
}
return response;
}
const { app, input } = require('@azure/functions');
const wpsContext = input.generic({
type: 'webPubSubContext',
name: 'wpsContext'
});
app.http('connect', {
methods: ['GET', 'POST'],
authLevel: 'anonymous',
extraInputs: [wpsContext],
handler: async (request, context) => {
var wpsRequest = context.extraInputs.get('wpsContext');
return { "userId": wpsRequest.request.connectionContext.userId };
}
});
Uwaga
Kompletne przykłady dla tego języka są oczekujące
Uwaga
Rozszerzenia Web PubSub dla języka Java nie są jeszcze obsługiwane.
Konfigurowanie
W poniższej tabeli opisano właściwości konfiguracji powiązania ustawione w pliku functions.json i atrybutu WebPubSubContext .
| właściwość function.json | Właściwość atrybutu | opis |
|---|---|---|
| typ | nie dotyczy | Musi być ustawiona wartość webPubSubContext. |
| kierunek | nie dotyczy | Musi być ustawiona wartość in. |
| nazwa | nie dotyczy | Nazwa zmiennej używana w kodzie funkcji dla wejściowego żądania Web PubSub. |
| połączenie | Połączenie | Opcjonalnie — nazwa ustawień aplikacji lub kolekcji ustawień, która określa nadrzędną usługę Azure Web PubSub. Wartość jest używana na potrzeby ochrony przed nadużyciami i weryfikacji podpisu. Wartość jest automatycznie rozpoznawana za pomocą polecenia "WebPubSubConnectionString" domyślnie. Oznacza to null , że weryfikacja nie jest potrzebna i zawsze kończy się powodzeniem. |
Ważne
Aby zapewnić optymalne zabezpieczenia, aplikacja funkcji powinna używać tożsamości zarządzanych podczas nawiązywania połączenia z usługą Web PubSub zamiast używać parametrów połączenia, które zawierają wspólny klucz tajny. Aby uzyskać więcej informacji, zobacz Autoryzowanie żądania tożsamości zarządzanej przy użyciu identyfikatora Entra firmy Microsoft.
Użycie
WebPubSubContext udostępnia następujące właściwości.
| Nazwa powiązania | Typ powiązania | opis | Właściwości |
|---|---|---|---|
| żądanie | WebPubSubEventRequest |
Aby uzyskać szczegółowe informacje, zobacz poniższą tabelę. |
WebPubSubConnectionContext z nagłówka żądania i inne właściwości deserializowane z treści żądania opisują żądanie, na przykład Reason dla DisconnectedEventRequest. |
| odpowiedź | HttpResponseMessage |
Rozszerzenie tworzy odpowiedź głównie w przypadku AbuseProtection przypadków błędów i . |
- |
| komunikat o błędzie | ciąg | Opisz szczegóły błędu podczas przetwarzania nadrzędnego żądania. | - |
| hasError | Bool | Flaga wskazująca, czy jest to prawidłowe żądanie nadrzędne Web PubSub. | - |
| isPreflight | Bool | Flaga wskazująca, czy jest to żądanie wstępne .AbuseProtection |
- |
W przypadku WebPubSubEventRequestprogramu jest deserializowany do różnych klas, które zawierają różne informacje o scenariuszu żądania. W przypadku PreflightRequest nieprawidłowych przypadków użytkownik może sprawdzić flagi IsPreflight i HasError wiedzieć. Zalecamy bezpośrednie zwrócenie odpowiedzi kompilacji WebPubSubContext.Response systemu lub klient może rejestrować błędy na żądanie. W różnych scenariuszach klient może odczytać właściwości żądania w następujący sposób.
| Klasa pochodna | opis | Właściwości |
|---|---|---|
PreflightRequest |
Używany w AbuseProtection przypadku, gdy IsPreflight ma wartość true |
- |
ConnectEventRequest |
Używane w typie zdarzeń systemowych Connect |
Oświadczenia, zapytanie, podprotocols, ClientCertificates |
ConnectedEventRequest |
Używane w typie zdarzeń systemowych Connected |
- |
UserEventRequest |
Używany w typie zdarzenia użytkownika | Dane, Typ danych |
DisconnectedEventRequest |
Używane w typie zdarzeń systemowych Disconnected |
Przyczyna |
Uwaga
WebPubSubContextChociaż jest to powiązanie wejściowe zapewnia podobny sposób deserializacji żądania wHttpTriggerporównaniu zWebPubSubTrigger, istnieją ograniczenia, tj. stan połączenia po scaleniu nie jest obsługiwany. Odpowiedź zwrotna jest nadal przestrzegana przez usługę, ale użytkownicy muszą sami utworzyć odpowiedź. Jeśli użytkownicy muszą ustawić odpowiedź na zdarzenie, należy zwrócićHttpResponseMessagekomunikaty zawierająceConnectEventResponselub dla zdarzenia użytkownika jako treść odpowiedzi i umieścić stan połączenia z kluczemce-connectionstatew nagłówku odpowiedzi.