Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
Nuestra extensión proporciona dos enlaces de entrada destinados a necesidades diferentes.
-
Para que un cliente pueda conectarse al servicio Azure Web PubSub, debe conocer la dirección URL del punto de conexión del servicio y tener un token de acceso válido. El enlace de entrada
WebPubSubConnectiongenera la información necesaria, por lo que el cliente no necesita controlar la generación de tokens. El token tiene un tiempo limitado y puede autenticar a un usuario específico en una conexión. Por lo tanto, no almacene en caché el token ni compártalo entre clientes. Se puede usar un desencadenador HTTP que funcione con este enlace de entrada para que los clientes recuperen la información de conexión. -
Cuando se usa Static Web Apps,
HttpTriggeres el único desencadenador admitido. En escenarios de Web PubSub, elWebPubSubContextenlace de entrada ayuda a los usuarios a deserializar las solicitudes HTTP ascendentes del servicio en protocolos de Web PubSub. Por lo tanto, los clientes pueden obtener resultados similares en comparación conWebPubSubTriggerpara controlar fácilmente las funciones. Cuando se usa conHttpTrigger, el cliente debe configurar la dirección URL expuesta de HttpTrigger en el controlador de eventos según corresponda.
WebPubSubConnection
Ejemplo
En el ejemplo siguiente se muestra una función de desencadenador HTTP que adquiere información de conexión de Web PubSub mediante el enlace de entrada y la devuelve a través de HTTP. En el ejemplo siguiente, se UserId pasa a través de la parte de consulta de solicitud de cliente, como ?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')) };
},
});
Cree una carpeta negotiate y actualice negotiate/function.json y copie los siguientes códigos 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"
}
]
}
Defina la función en negotiate/init.py.
import logging
import azure.functions as func
def main(req: func.HttpRequest, connection) -> func.HttpResponse:
return func.HttpResponse(connection)
Nota:
Los ejemplos completos de este lenguaje están pendientes
Nota:
Todavía no se admiten las extensiones de Web PubSub para Java.
Obtención del identificador de usuario autenticado
Si la función la desencadena un cliente autenticado, puede agregar una notificación del identificador de usuario al token generado. Puede agregar fácilmente la autenticación a una aplicación de función mediante Autenticación de App Service.
Autenticación de App Service establece encabezados HTTP denominados x-ms-client-principal-id y x-ms-client-principal-name que contienen el identificador y el nombre de la entidad de seguridad de cliente del usuario autenticado, respectivamente.
Puede establecer la UserId propiedad del enlace en el valor de cualquier encabezado mediante una expresión de enlace: {headers.x-ms-client-principal-id} o {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')) };
},
});
Cree una carpeta negotiate y actualice negotiate/function.json y copie los siguientes códigos 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"
}
]
}
Defina la función en negotiate/init.py.
import logging
import azure.functions as func
def main(req: func.HttpRequest, connection) -> func.HttpResponse:
return func.HttpResponse(connection)
Nota:
Los ejemplos completos de este lenguaje están pendientes
Nota:
Todavía no se admiten las extensiones de Web PubSub para Java.
Configuración
En la tabla siguiente se explican las propiedades de configuración del enlace que se establecen en el archivo function.json y el atributo WebPubSubConnection.
| Propiedad de function.json | Propiedad de atributo | Descripción |
|---|---|---|
| tipo | N/D | Se debe establecer en webPubSubConnection |
| dirección | N/D | Se debe establecer en in |
| nombre | N/D | Nombre de variable utilizado en el código de función para el objeto de enlace de la conexión de entrada. |
| concentrador | Centro | Requerido: el valor debe establecerse en el nombre del centro de Web PubSub para la función que se va a desencadenar. Se permite establecer el valor en el atributo como prioridad más alta o se puede establecer en la configuración de la aplicación como un valor global. |
| userId | UserId | Opcional: valor de la notificación del identificador de usuario que se debe establecer en el token de la clave de acceso. |
| clientProtocol | ClientProtocol | Opcional: tipo de protocolo de cliente. Entre los valores válidos se incluyen default y mqtt. Para los clientes MQTT, debe establecerlo en mqtt. Para otros clientes, puede omitir la propiedad o establecerla en default. |
| conexión | Conexión | Obligatorio: el nombre de la configuración de la aplicación que contiene la cadena de conexión del servicio Web PubSub (el valor predeterminado es "AzureSignalRConnectionString"). |
Uso
WebPubSubConnection proporciona las siguientes propiedades.
| Nombre del enlace | Tipo de enlace | Descripción |
|---|---|---|
| BaseUri | Identificador URI | Identificador URI de conexión de cliente de Web PubSub. |
| Identificador URI | Identificador URI | Identificador URI absoluto de la conexión de Web PubSub; contiene la base generada por AccessToken en la solicitud. |
| AccessToken | cuerda / cadena |
AccessToken generado basado en la información de servicio y UserId de la solicitud. |
WebPubSubConnection proporciona las siguientes propiedades.
| Nombre del enlace | Descripción |
|---|---|
| baseUrl | Identificador URI de conexión de cliente de Web PubSub. |
| dirección url | Identificador URI absoluto de la conexión de Web PubSub; contiene la base generada por AccessToken en la solicitud. |
| accessToken |
AccessToken generado basado en la información de servicio y UserId de la solicitud. |
Nota:
Todavía no se admiten las extensiones de Web PubSub para Java.
Más personalización del token generado
Limitado a los tipos de parámetros de enlace no admiten una manera de pasar una lista ni una matriz, no WebPubSubConnection es totalmente compatible con todos los parámetros que tiene el SDK del servidor de parámetros, especialmente roles, y también incluye groups y expiresAfter.
Cuando el cliente necesita agregar roles o retrasar la creación del token de acceso en la función, se recomienda trabajar con el SDK de servidor para 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;
}
Cuando el cliente necesita agregar roles o retrasar la creación del token de acceso en la función, se recomienda trabajar con el SDK de servidor para 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 };
},
});
Nota:
Los ejemplos completos de este lenguaje están pendientes
Nota:
Todavía no se admiten las extensiones de Web PubSub para Java.
WebPubSubContext
Ejemplo
// 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 };
}
});
Nota:
Los ejemplos completos de este lenguaje están pendientes
Nota:
Todavía no se admiten las extensiones de Web PubSub para Java.
Configuración
En la siguiente tabla se explican las propiedades de configuración de enlace que se definen en el archivo functions.json y el atributo WebPubSubContext.
| Propiedad de function.json | Propiedad de atributo | Descripción |
|---|---|---|
| tipo | N/D | Se debe establecer en webPubSubContext. |
| dirección | N/D | Se debe establecer en in. |
| nombre | N/D | Nombre de variable usado en el código de función para la solicitud de Web PubSub de entrada. |
| conexión | Conexión | Opcional: el nombre de una configuración de aplicación o una colección de configuraciones que especifica el servicio Azure Web PubSub ascendente. El valor se usará para la protección contra abusos y la validación de firmas. Y el valor se resolverá automáticamente con "WebPubSubConnectionString" de forma predeterminada. Y null significa que la validación no es necesaria y siempre se realiza correctamente. |
Importante
Para una seguridad óptima, la aplicación de funciones debe usar identidades administradas al conectarse al servicio Web PubSub en lugar de usar una cadena de conexión, que contiene una clave secreta compartida. Para obtener más información, consulte Autorización de una solicitud de identidad administrada mediante microsoft Entra ID.
Uso
WebPubSubContext proporciona las siguientes propiedades.
| Nombre del enlace | Tipo de enlace | Descripción | Propiedades |
|---|---|---|---|
| solicitud | WebPubSubEventRequest |
Solicitud del cliente, consulte la tabla siguiente para obtener más información. |
WebPubSubConnectionContext desde el encabezado de solicitud y otras propiedades deserializadas del cuerpo de la solicitud describen a esta, por ejemplo, Reason para DisconnectedEventRequest. |
| respuesta | HttpResponseMessage |
La extensión genera la respuesta principalmente para AbuseProtection y los casos de error. |
- |
| mensaje de error | cuerda / cadena | Describa los detalles del error al procesar la solicitud ascendente. | - |
| hasError | booleano | Marca para indicar si se trata de una solicitud ascendente de Web PubSub válida. | - |
| isPreflight | booleano | Marca para indicar si se trata de una solicitud preparatoria de AbuseProtection. |
- |
Para WebPubSubEventRequest, se deserializa en diferentes clases que proporcionan información diferente sobre el escenario de solicitud. Para PreflightRequest o para casos no válidos, el usuario puede comprobar las marcas IsPreflight y HasError y averiguarlo. Se recomienda devolver la respuesta WebPubSubContext.Response de compilación del sistema directamente o el cliente puede registrar errores a petición. En diferentes escenarios, el cliente puede leer las propiedades de solicitud como se indica a continuación.
| Clase derivada | Descripción | Propiedades |
|---|---|---|
PreflightRequest |
Se usa en AbuseProtection cuando IsPreflight es true. |
- |
ConnectEventRequest |
Se usa en el tipo de evento Connect del sistema. |
Reclamaciones, Consulta, Subprotocolos, Certificados de Cliente |
ConnectedEventRequest |
Se usa en el tipo de evento Connected del sistema. |
- |
UserEventRequest |
Se usa en el tipo de evento de usuario. | Datos, TipoDeDato |
DisconnectedEventRequest |
Se usa en el tipo de evento Disconnected del sistema. |
Motivo |
Nota:
Aunque es
WebPubSubContextun enlace de entrada proporciona una forma similar de deserializar la solicitud enHttpTriggercomparación conWebPubSubTrigger, no se admiten las limitaciones, es decir, el estado de conexión posterior a la combinación. El lado del servicio seguirá respetando la respuesta de devolución, pero los usuarios deberán crear la respuesta ellos mismos. Si los usuarios tienen que establecer la respuesta del evento, debe devolver una respuestaHttpResponseMessageque contengaConnectEventResponseo mensajes del evento del usuario como cuerpo de la respuesta y poner el estado de conexión con la clavece-connectionstateen el encabezado de respuesta.