Я работаю над проектом с интерфейсом React, использующим аутентификацию Firebase и серверный API C#. Интерфейс получает и отправляет токен идентификатора Firebase для аутентификации, но я сталкиваюсь с несанкционированной ошибкой 401 с сообщением «Срок действия токена идентификатора Firebase истек» в аутентифицированном запросе.
Код интерфейса (AuthContext) .js):
функция makeAuthenticatedRequest обрабатывает аутентифицированные вызовы API и
пытается обновить токен в случае сбоя.
< li>getFreshToken управляет обновлением токена с ограничением в 5 минут
401 Несанкционировано: при выполнении аутентифицированных запросов из
интерфейса я часто получаю сообщение Ошибка 401.
Срок действия токена: сообщение об ошибке указывает на то, что срок действия токена Firebase ID
истек. Я думал, что функция getFreshToken() в моем
AuthContext.js справится с обновлением, но, похоже,
иногда она дает сбой.
Что я пробовал
Реализовать механизм обновления токена, который пытается получить новый ID
токен, если срок действия текущего истек.
Повторная попытка запроса API один раз, если обнаружена ошибка 401.
Честно говоря, я сейчас очень растерян и не могу точно определить, что является причиной истечения срока действия токена. Почему токены так быстро истекают? Я неправильно обработал токен, если да, то какое решение лучше всего? Наконец, пропустил ли я что-нибудь из своего бэкэнда? Спасибо.
Я работаю над проектом с интерфейсом React, использующим аутентификацию Firebase и серверный API C#. Интерфейс получает и отправляет токен идентификатора Firebase для аутентификации, но я сталкиваюсь с несанкционированной ошибкой 401 с сообщением «Срок действия токена идентификатора Firebase истек» в аутентифицированном запросе. Код интерфейса (AuthContext) .js): [list] [*]функция makeAuthenticatedRequest обрабатывает аутентифицированные вызовы API и пытается обновить токен в случае сбоя. < li>getFreshToken управляет обновлением токена с ограничением в 5 минут [/list] [code] // AuthContext.js const getFreshToken = async (force = false) => { if (!user) return null;
[/code] Верхний код (AuthController.cs): конечная точка TestProtected проверяет токен и разрешения пользователя. [code]// AuthController.cs using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using FirebaseAdmin.Auth; using UniLostAndFound.API.Services; using UniLostAndFound.API.Models;
namespace UniLostAndFound.API.Controllers;
[ApiController] [Route("api/[controller]")] public class AuthController : ControllerBase { private readonly ILogger _logger; private readonly FirestoreService _firestoreService;
try { var firebaseToken = await FirebaseAuth.DefaultInstance.VerifyIdTokenAsync(idToken); string email = firebaseToken.Claims.GetValueOrDefault("email", "").ToString(); string name = firebaseToken.Claims.GetValueOrDefault("name", "").ToString();
// Check if email is allowed if (!await _firestoreService.IsAllowedEmail(email)) { return Unauthorized(new { message = "Email domain not allowed" }); }
// Check if user is admin bool isAdmin = await _firestoreService.IsAdminEmail(email);
return Ok(new { message = "Authentication successful", user = new { uid = firebaseToken.Uid, email = email, name = name, isAdmin = isAdmin } }); } catch (FirebaseAuthException ex) { _logger.LogWarning($"Token verification failed: {ex.Message}"); return Unauthorized(new { message = ex.Message }); } catch (Exception ex) { _logger.LogError($"Unexpected error during token verification: {ex.Message}"); return StatusCode(500, new { message = "Internal server error during authentication" }); } } catch (Exception ex) { _logger.LogError($"Unexpected error: {ex.Message}"); return StatusCode(500, new { message = "Internal server error" }); } } } [/code] Program.cs [code]// Update the JWT Bearer configuration builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { var projectId = "unilostandfound"; options.Authority = $"https://securetoken.google.com/{projectId}"; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = $"https://securetoken.google.com/{projectId}", ValidateAudience = true, ValidAudience = projectId, ValidateLifetime = true, ClockSkew = TimeSpan.FromMinutes(5) }; }); [/code] Возникшие проблемы [list] [*]401 Несанкционировано: при выполнении аутентифицированных запросов из интерфейса я часто получаю сообщение Ошибка 401. [*]Срок действия токена: сообщение об ошибке указывает на то, что срок действия токена Firebase ID истек. Я думал, что функция getFreshToken() в моем AuthContext.js справится с обновлением, но, похоже, иногда она дает сбой. [/list] Что я пробовал [list] [*]Реализовать механизм обновления токена, который пытается получить новый ID токен, если срок действия текущего истек. Повторная попытка запроса API один раз, если обнаружена ошибка 401. [/list] Честно говоря, я сейчас очень растерян и не могу точно определить, что является причиной истечения срока действия токена. Почему токены так быстро истекают? Я неправильно обработал токен, если да, то какое решение лучше всего? Наконец, пропустил ли я что-нибудь из своего бэкэнда? Спасибо.
В настоящее время я использую Google Cloud Workload Identity Federation с AWS для создания подписанного JWT для сервисного аккаунта, как показано ниже.
...
Я разрабатываю приложение Java (с использованием Spring Boot), и мне нужна помощь: Это приложение получает на входе токен JWT , который я обрабатываю в методе. На данный момент метод следующий:
Я использую эту библиотеку для сброса пароля пользователя. Это блок кода, который генерирует код:
async def create_code(db: AsyncSession, user):
secret_key = pyotp.random_base32()