Проверка токена идентификатора Firebase внутри IUserIdProvider — SignalR — Firebase Admin SDK C#

#firebase-authentication #signalr #asp.net-core-3.1

#firebase-аутентификация #signalr #asp.net-core-3.1

Вопрос:

Я использую аутентификацию Firebase для моего существующего веб-API, созданного на ASP.NET Ядро 3.1. Я должен проверить токен идентификатора пользователя firebase внутри GetUserId метода IUserIdProvider интерфейса.

Коды на стороне сервера:

 public class CustomUserIdProvider : IUserIdProvider
{
     
    public string GetUserId(HubConnectionContext connection)
    { 

        /* Getting token from header when a SignalR client is connecting */
        string FirebaseUserIDToken = connection.GetHttpContext().Request.Headers["token"];

        /* Decrypting firebase id token */
        FirebaseToken firebaseToken = await FirebaseAuth.DefaultInstance.VerifyIdTokenAsync(token);

        /* assigning firebase auth user id to SignalR user */
        return firebaseToken.Uid;

    }
}
  

проблема в том, что await FirebaseAuth.DefaultInstance.VerifyIdTokenAsync(token) это асинхронная функция и GetUserId не поддерживает асинхронные вызовы.

Коды на стороне клиента:

 hubConnection = HubConnectionBuilder.create("<my server>/testHub").withHeader("token", <firebase id token>).build();
    
  

По соображениям безопасности я не могу просто прикрепить firebase UID в заголовке вместо токена идентификатора firebase.

Ответ №1:

Я нашел решение,

 Task<FirebaseToken> task = FirebaseAuth.DefaultInstance.VerifyIdTokenAsync("<ID Token Here>");
task.Wait(); //this did the trick.
string uid = task.Result.Uid;
  

Если вы хотите проверить, успешно ли выполнена задача, используйте task.IsCompletedSuccessfully свойство.