WebSocket-clientprotocollen voor Azure Web PubSub
Clients maken verbinding met Azure Web PubSub met behulp van het standaard WebSocket-protocol .
Service-eindpunten
De Web PubSub-service biedt twee typen eindpunten waarmee clients verbinding kunnen maken met:
/client/hubs/{hub}
/client/?hub={hub}
{hub}
is een verplichte parameter die fungeert als isolatie voor verschillende toepassingen. U kunt deze instellen in het pad of de query.
Autorisatie
Clients maken verbinding met de service met een JSON-webtoken (JWT). Het token kan zich in de querytekenreeks bevinden, als /client/?hub={hub}&access_token={token}
, of in de Authorization
header, als Authorization: Bearer {token}
.
Hier volgt een algemene autorisatiewerkstroom:
- De client onderhandelt met uw toepassingsserver. De toepassingsserver bevat de autorisatie-middleware, die de clientaanvraag afhandelt en een JWT ondertekent voor de client om verbinding te maken met de service.
- De toepassingsserver retourneert de JWT en de service-URL naar de client.
- De client probeert verbinding te maken met de Web PubSub-service met behulp van de URL en het JWT-token dat is geretourneerd door de toepassingsserver.
Ondersteunde claims
U kunt ook eigenschappen voor de clientverbinding configureren bij het genereren van het toegangstoken door speciale claims op te geven in het JWT-token:
Beschrijving | Claimtype | Claimwaarde | Opmerkingen |
---|---|---|---|
De userId voor de clientverbinding |
sub |
de userId | Er is slechts één sub claim toegestaan. |
De levensduur van het token | exp |
de verlooptijd | De exp claim (verlooptijd) identificeert de verlooptijd op of waarna het token NIET mag worden geaccepteerd voor verwerking. |
De machtigingen die de clientverbinding aanvankelijk heeft | role |
de rolwaarde die is gedefinieerd in machtigingen | Geef meerdere role claims op als de client meerdere machtigingen heeft. |
De eerste groepen waaraan de clientverbinding wordt gekoppeld zodra deze verbinding maakt met Azure Web PubSub | group |
de groep waaraan moet worden toegevoegd | Geef meerdere group claims op als de client lid wordt van meerdere groepen. |
U kunt ook aangepaste claims toevoegen aan het toegangstoken en deze waarden blijven behouden als de claims
eigenschap in de upstream-aanvraagbody.
Server-SDK's bieden API's voor het genereren van het toegangstoken voor de clients.
De eenvoudige WebSocket-client
Een eenvoudige WebSocket-client, zoals de naamgeving aangeeft, is een eenvoudige WebSocket-verbinding. Het kan ook een eigen aangepast subprotocol hebben.
In JavaScript kunt u bijvoorbeeld een eenvoudige WebSocket-client maken met behulp van de volgende code:
// simple WebSocket client1
var client1 = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1');
// simple WebSocket client2 with some custom subprotocol
var client2 = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'custom.subprotocol')
De PubSub WebSocket-client
Een PubSub WebSocket-client is de WebSocket-client met behulp van subprotocollen die zijn gedefinieerd door de Azure Web PubSub-service:
json.webpubsub.azure.v1
protobuf.webpubsub.azure.v1
Met het subprotocol dat door de service wordt ondersteund, kunnen de PubSub WebSocket-clientsberichten rechtstreeks publiceren naar groepen wanneer ze over de machtigingen beschikken.
Het json.webpubsub.azure.v1
subprotocol
Kijk hier voor het JSON-subprotocol in detail.
Een PubSub WebSocket-client maken
var pubsubClient = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'json.webpubsub.azure.v1');
Rechtstreeks lid worden van een groep vanaf de client
let ackId = 0;
pubsubClient.send(
JSON.stringify({
type: 'joinGroup',
group: 'group1',
ackId: ++ackId
}));
Berichten rechtstreeks vanaf de client naar een groep verzenden
let ackId = 0;
pubsubClient.send(
JSON.stringify({
type: 'sendToGroup',
group: 'group1',
ackId: ++ackId,
dataType: "json",
data: {
"hello": "world"
}
}));
Het protobuf.webpubsub.azure.v1
subprotocol
Protocolbuffers (protobuf) is een taalneutraal, platformneutraal, binair protocol dat het verzenden van binaire gegevens vereenvoudigt. Protobuf biedt hulpprogramma's voor het genereren van clients voor veel talen, zoals Java, Python, Objective-C, C# en C++. Meer informatie over protobuf.
In JavaScript kunt u bijvoorbeeld een PubSub WebSocket-client maken met een protobuf-subprotocol met behulp van de volgende code:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'protobuf.webpubsub.azure.v1');
Kijk hier voor het protobuf-subprotocol in detail.
AckId- en Ack-antwoord
De PubSub WebSocket-client ondersteunt ackId
eigenschap voorjoinGroup
, sendToGroup
leaveGroup
en event
berichten. Wanneer u deze ackId
gebruikt, kunt u een ack-antwoordbericht ontvangen wanneer uw aanvraag wordt verwerkt. U kunt ervoor kiezen om in brand- en vergeetscenario's weg te laten ackId
. In het artikel beschrijven we de gedragsverschillen tussen het opgeven ackId
of niet.
Gedrag wanneer er geen opgegeven is ackId
Als ackId
dit niet is opgegeven, is het vuur-en-vergeet. Zelfs als er fouten optreden bij het brokeren van berichten, kunt u geen melding ontvangen.
Gedrag wanneer ackId
opgegeven
Idempotent publiceren
ackId
is een uint64-nummer en moet uniek zijn binnen een client met dezelfde verbindings-id. Web PubSub Service registreert de ackId
en berichten met hetzelfde ackId
bericht worden behandeld als hetzelfde bericht. De service weigert hetzelfde bericht meer dan één keer te brokeren, wat handig is bij het opnieuw proberen om dubbele berichten te voorkomen. Als een client bijvoorbeeld een bericht verzendt met een ack-antwoord ackId=5
met ackId=5
en niet ontvangt, probeert de client opnieuw en verzendt hetzelfde bericht opnieuw. In sommige gevallen is het bericht al brokered en gaat het ack-antwoord om een of andere reden verloren. De service weigert de nieuwe poging en beantwoordt een ack-antwoord met Duplicate
reden.
Ack-antwoord
Web PubSub Service verzendt ack-antwoord voor elke aanvraag met ackId
.
Indeling:
{
"type": "ack",
"ackId": 1, // The ack id for the request to ack
"success": false, // true or false
"error": {
"name": "Forbidden|InternalServerError|Duplicate",
"message": "<error_detail>"
}
}
De
ackId
aanvraag wordt gekoppeld.success
is een bool en geeft aan of de aanvraag is verwerkt door de service. Als dat het isfalse
, moeten clients deerror
.error
bestaat alleen wanneersuccess
dit het geval isfalse
en clients moeten verschillende logica hebben voor verschillendename
. Stel dat er in de toekomst meer soortenname
zijn.Forbidden
: De client heeft niet de machtiging voor de aanvraag. De client moet relevante rollen worden toegevoegd.InternalServerError
: Er is een interne fout opgetreden in de service. Opnieuw proberen is vereist.Duplicate
: Het bericht met hetzelfdeackId
bericht is al verwerkt door de service.
Machtigingen
Zoals u waarschijnlijk hebt opgemerkt in de eerdere beschrijving van de PubSub WebSocket-client, kan een client alleen publiceren naar andere clients wanneer dit is geautoriseerd . De machtigingen van een client kunnen worden verleend wanneer deze is verbonden of tijdens de levensduur van de verbinding.
Rol | Machtiging |
---|---|
Niet opgegeven | De client kan gebeurtenisaanvragen verzenden. |
webpubsub.joinLeaveGroup |
De client kan deelnemen aan of elke groep verlaten. |
webpubsub.sendToGroup |
De client kan berichten publiceren naar elke groep. |
webpubsub.joinLeaveGroup.<group> |
De client kan deelnemen aan of de groep <group> verlaten. |
webpubsub.sendToGroup.<group> |
De client kan berichten naar groep <group> publiceren. |
De machtiging van een client kan op verschillende manieren worden verleend:
1. Wijs de rol toe aan de client bij het genereren van het toegangstoken
Client kan verbinding maken met de service met behulp van een JWT-token. De nettolading van het token kan informatie bevatten, zoals de role
client. Wanneer u het JWT-token aan de client ondertekent, kunt u machtigingen verlenen aan de client door de client specifieke rollen te geven.
Laten we bijvoorbeeld een JWT-token ondertekenen dat de machtiging heeft om berichten te verzenden naar group1
en group2
:
let token = await serviceClient.getClientAccessToken({
roles: [ "webpubsub.sendToGroup.group1", "webpubsub.sendToGroup.group2" ]
});
2. Wijs de rol toe aan de client met de connect
gebeurtenis-handler
De rollen van de clients kunnen ook worden ingesteld wanneer de connect
gebeurtenis-handler is geregistreerd en de upstream-gebeurtenis-handler de client kan retourneren roles
naar de Web PubSub-service bij het verwerken van de connect
gebeurtenissen.
In JavaScript kunt u bijvoorbeeld de handleConnect
gebeurtenis zo configureren:
let handler = new WebPubSubEventHandler("hub1", {
handleConnect: (req, res) => {
// auth the connection and set the userId of the connection
res.success({
roles: [ "webpubsub.sendToGroup.group1", "webpubsub.sendToGroup.group2" ]
});
},
});
3. Wijs de rol toe aan de client via REST API's of server-SDK's tijdens runtime
let service = new WebPubSubServiceClient("<your_connection_string>", "test-hub");
await service.grantPermission("<connection_id>", "joinLeaveGroup", { targetName: "group1" });
Volgende stappen
Gebruik deze resources om te beginnen met het bouwen van uw eigen toepassing: