Хранение настраиваемой информации в службе Azure SignalR (без сервера) SignalRConnectionInfoAttribute
Я использую SignalR Serverless. Когда клиент ведет переговоры, он передает AccessToken, полученный из API, который затем предоставляется в заголовке авторизации через JS HubConnectionBuilder.
Внутри функции Azure для согласования я проверяю токен с помощью указанного API и после проверки помещаю userId в SignalRConnectionInfoAttribute, как в этом упрощенном примере:
[FunctionName("MessagesNegotiateBinding")]
public static IActionResult NegotiatBinding(
[HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req,
IBinder binder,
ILogger log)
{
var token = req.Headers["Authorization"];
var userId = "userIdExtractedFromToken"; // goes to in-house auth API here
var connectionInfo = binder.Bind<SignalRConnectionInfo>(new
SignalRConnectionInfoAttribute{HubName = "messages", UserId = userId});
return (ActionResult) new OkObjectResult(connectionInfo);
}
Мне понадобится доступ к этому исходному токену позже, когда связанное событие будет обнаружено после публикации в EventGrid. В этот момент у меня есть userId в привязке connectionInfo, но мне также нужен этот исходный токен.
Чтобы преодолеть это, я изменил формат userId на "userId|token". Это нехорошо, и из-за этого я не могу отправлять сообщения этому пользователю с помощью только userId, поэтому мне пришлось добавить каждого пользователя в группу, для которой он является единственным членом.
Есть ли другой способ сохранить токен, который мне нужен, в Negotiate, чтобы он был доступен мне из события ClientConnectionConnected из EventGrid? Причина в том, что когда соединение установлено, мне нужно еще раз вызвать API и передать токен.
Я не могу сменить клиента, иначе я бы вызвал API с их стороны после успешного подключения.