Azure Web PubSub için WebSocket istemci protokolleri
İstemciler standart WebSocket protokolunu kullanarak Azure Web PubSub'a bağlanır.
Hizmet uç noktaları
Web PubSub hizmeti, istemcilerin bağlanması için iki tür uç nokta sağlar:
/client/hubs/{hub}
/client/?hub={hub}
{hub}
, çeşitli uygulamalar için yalıtım işlevi gören zorunlu bir parametredir. Bunu yolda veya sorguda ayarlayabilirsiniz.
Yetkilendirme
İstemciler hizmete bir JSON Web Belirteci (JWT) ile bağlanır. Belirteç olarak /client/?hub={hub}&access_token={token}
sorgu dizesinde veya üst bilgisinde Authorization
olabilir Authorization: Bearer {token}
.
Genel yetkilendirme iş akışı aşağıdadır:
- İstemci, uygulama sunucunuzla anlaşma sağlar. Uygulama sunucusu, istemci isteğini işleyen ve istemcinin hizmete bağlanması için bir JWT imzalayan yetkilendirme ara yazılımını içerir.
- Uygulama sunucusu JWT'yi ve hizmet URL'sini istemciye döndürür.
- İstemci, URL'yi ve uygulama sunucusundan döndürülen JWT belirtecini kullanarak Web PubSub hizmetine bağlanmaya çalışır.
Desteklenen talepler
JWT belirtecinin içinde özel talepler belirterek erişim belirtecini oluştururken istemci bağlantısının özelliklerini de yapılandırabilirsiniz:
Açıklama | Talep türü | Talep değeri | Notlar |
---|---|---|---|
userId İstemci bağlantısı için |
sub |
userId | Yalnızca bir sub talepe izin verilir. |
Belirtecin ömrü | exp |
süre sonu | exp (süre sonu) talebi, belirtecin işlenmek üzere kabul edilmemesi gereken veya sonrasındaki süre sonunu tanımlar. |
İstemci bağlantısının başlangıçta sahip olduğu izinler | role |
izinlerde tanımlanan rol değeri | İstemcinin birden çok role izni varsa birden çok talep belirtin. |
İstemci bağlantısının Azure Web PubSub'a bağlandıktan sonra katıldığı ilk gruplar | group |
katılacağınız grup | İstemci birden çok group gruba katılırsa birden çok talep belirtin. |
Erişim belirtecine özel talepler de ekleyebilirsiniz ve bu değerler yukarı akış isteği gövdesine claims
bağlanma özelliği olarak korunur.
Sunucu SDK'ları , istemciler için erişim belirtecini oluşturmak üzere API'ler sağlar.
Basit WebSocket istemcisi
Adlandırmanın da belirttiği gibi basit bir WebSocket istemcisi basit bir WebSocket bağlantısıdır. Ayrıca kendi özel alt makrosna da sahip olabilir.
Örneğin, JavaScript'te aşağıdaki kodu kullanarak basit bir WebSocket istemcisi oluşturabilirsiniz:
// 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')
PubSub WebSocket istemcisi
PubSub WebSocket istemcisi, Azure Web PubSub hizmeti tarafından tanımlanan alt protokolleri kullanan WebSocket istemcisidir:
json.webpubsub.azure.v1
protobuf.webpubsub.azure.v1
Hizmet tarafından desteklenen altprotocol ile PubSub WebSocket istemcisi, izinlere sahip olduklarında iletileri doğrudan gruplara yayımlayabilir.
Altprotocol json.webpubsub.azure.v1
JSON altprotokolü için buraya ayrıntılı olarak bakın.
PubSub WebSocket istemcisi oluşturma
var pubsubClient = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'json.webpubsub.azure.v1');
İstemciden bir gruba doğrudan katılma
let ackId = 0;
pubsubClient.send(
JSON.stringify({
type: 'joinGroup',
group: 'group1',
ackId: ++ackId
}));
İstemciden doğrudan bir gruba ileti gönderme
let ackId = 0;
pubsubClient.send(
JSON.stringify({
type: 'sendToGroup',
group: 'group1',
ackId: ++ackId,
dataType: "json",
data: {
"hello": "world"
}
}));
Altprotocol protobuf.webpubsub.azure.v1
Protokol arabellekleri (protobuf), ikili veri göndermeyi kolaylaştıran dilden bağımsız, platformdan bağımsız, ikili tabanlı bir protokoldür. Protobuf Java, Python, Objective-C, C# ve C++ gibi birçok dil için istemci oluşturmaya yönelik araçlar sağlar. protobuf hakkında daha fazla bilgi edinin.
Örneğin, JavaScript'te aşağıdaki kodu kullanarak protobuf altprotocol'u olan bir PubSub WebSocket istemcisi oluşturabilirsiniz:
// PubSub WebSocket client
var pubsub = new WebSocket('wss://test.webpubsub.azure.com/client/hubs/hub1', 'protobuf.webpubsub.azure.v1');
Protobuf altprotokolü için buraya ayrıntılı olarak bakın.
AckId ve Ack Yanıtı
PubSub WebSocket İstemcisi , leaveGroup
sendToGroup
ve event
iletileri için joinGroup
özelliğini desteklerackId
. kullanırken ackId
, isteğiniz işlendiğinde bir yanıt iletisi alabilirsiniz. Yangın ve unut senaryolarında atlayabilirsiniz ackId
. Makalede belirtme veya belirtme ackId
arasındaki davranış farkları açıklanmaktadır.
No ackId
belirtildiğinde davranış
Belirtilmezse ackId
, bu ateş ve unutmadır. İletileri aracılık ederken hatalar olsa bile bildirim almanıza imkan yoktur.
Belirtildiğinde ackId
davranış
Bir kez etkili yayımlama
ackId
bir uint64 numarasıdır ve aynı bağlantı kimliğine sahip bir istemci içinde benzersiz olmalıdır. Web PubSub Hizmeti ackId
, ve iletilerini kaydeder ve aynı ackId
ileti olarak değerlendirilir. Hizmet aynı iletiye birden çok kez aracılık etmeyi reddeder ve yinelenen iletileri önlemek için yeniden denemede yararlı olur. Örneğin, bir istemci ile ackId=5
bir ileti gönderirse ve ile ackId=5
bir hata yanıtı alamazsa, istemci aynı iletiyi yeniden dener ve gönderir. Bazı durumlarda, ileti zaten aracılı ve bir nedenle ack yanıt kaybolur. Hizmet yeniden denemeyi reddeder ve bir hata yanıtını nedenle Duplicate
yanıtlar.
Ack Yanıtı
Web PubSub Hizmeti ile ackId
her istek için ack yanıtı gönderir.
Biçim:
{
"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>"
}
}
isteği
ackId
ilişkilendirir.success
bir bool değeridir ve isteğin hizmet tarafından başarıyla işlenip işlenmediğini gösterir. buysafalse
, istemcilerin öğesini denetlemesierror
gerekir.error
yalnızca isfalse
olduğundasuccess
ve istemcilerin farklıname
için farklı mantığı olmalıdır. Gelecekte daha fazla türüname
olabileceğini düşünmelisiniz.Forbidden
: İstemcinin istek için izni yok. İstemcinin ilgili roller eklenmesi gerekir.InternalServerError
: Hizmette bir iç hata oluştu. Yeniden deneme gereklidir.Duplicate
: Aynı iletiackId
hizmet tarafından zaten işlenmiştir.
İzinler
Daha önceki PubSub WebSocket istemci açıklamasında büyük olasılıkla fark ettiğiniz gibi, bir istemci diğer istemcilere yalnızca yetkilendirildiğinde yayımlayabilir. Bir istemcinin izinleri, bağlantı kurulduğunda veya bağlantının ömrü boyunca verilebilir.
Role | İzin |
---|---|
Belirtilmemiş | İstemci olay istekleri gönderebilir. |
webpubsub.joinLeaveGroup |
İstemci herhangi bir gruba katılabilir veya gruptan ayrılabilir. |
webpubsub.sendToGroup |
İstemci, iletileri herhangi bir gruba yayımlayabilir. |
webpubsub.joinLeaveGroup.<group> |
İstemci grubuna katılabilir veya gruptan <group> ayrılabilir. |
webpubsub.sendToGroup.<group> |
İstemci, grubuna <group> ileti yayımlayabilir. |
bir istemcinin izni çeşitli yollarla verilebilir:
1. Erişim belirtecini oluştururken rolü istemciye atayın
İstemci bir JWT belirteci kullanarak hizmete bağlanabilir. Belirteç yükü, istemcininki role
gibi bilgileri taşıyabilir. JWT belirtecini istemciye imzalarken, istemciye özel roller vererek istemciye izin vekleyebilirsiniz.
Örneğin, ve group2
adresine ileti group1
gönderme iznine sahip bir JWT belirteci imzalayalım:
let token = await serviceClient.getClientAccessToken({
roles: [ "webpubsub.sendToGroup.group1", "webpubsub.sendToGroup.group2" ]
});
2. Rolü olay işleyicisi ile istemciye atayın connect
olay işleyicisi kaydedildiğinde ve yukarı akış olay işleyicisi olayları işlerken connect
istemcinin Web PubSub hizmetine döndürebileceği roles
durumlarda da istemcilerin connect
rolleri ayarlanabilir.
Örneğin, JavaScript'te olayı bunu yapacak şekilde yapılandırabilirsiniz handleConnect
:
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. Çalışma zamanı sırasında REST API'leri veya sunucu SDK'ları aracılığıyla rolü istemciye atayın
let service = new WebPubSubServiceClient("<your_connection_string>", "test-hub");
await service.grantPermission("<connection_id>", "joinLeaveGroup", { targetName: "group1" });
Sonraki adımlar
Kendi uygulamanızı oluşturmaya başlamak için şu kaynakları kullanın: