#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
свойство.