Хранение настраиваемой информации в службе 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 с их стороны после успешного подключения.

0 ответов

Другие вопросы по тегам