Почему токен не приходит на API?
Всем привет, у меня есть API написанное на C# ASP .Net. На этом апи происходит получение токена пользователя из заголовка тким образом:
string? token = context.Request.Headers["Authorization"].FirstOrDefault()?.Replace("Bearer ", ""); |
string? token = context.Request.Headers["Authorization"].FirstOrDefault()?.Replace("Bearer ", "");
По непонятной мне причине, при запросе через программу POSTMAN с таким заголовком токена: Authorization Bearer {{accessToken}} (где accessToken - переменная в которой записан токен) всё работает корректно, на бэке в логи выводится правильный токен, однако когда я произвожу такой же (на мой непрофессиональный взгляд) запрос с моего фронт-энда, вот пример кода:
export async function requestToAPI(data: any, requestType: string, requestURL: string, token: string | null = null) { let options; console.log("requestUrl: " + requestURL); let headers: Record<string, string> = { 'Content-Type': 'application/json', }; console.log(token + " token in requestToAPI"); if (token != null) { headers['Authorization'] = `Bearer ${token}`; } if (requestType === "GET") { options = { method: requestType, headers: headers, }; } else { options = { method: requestType, headers: headers, body: JSON.stringify(data) }; } console.log("Request Headers:", options.headers); console.log("Start sending a request to API"); const response = await fetch(requestURL, options); ... |
export async function requestToAPI(data: any, requestType: string, requestURL: string, token: string | null = null) { let options; console.log("requestUrl: " + requestURL); let headers: Record<string, string> = { 'Content-Type': 'application/json', }; console.log(token + " token in requestToAPI"); if (token != null) { headers['Authorization'] = `Bearer ${token}`; } if (requestType === "GET") { options = { method: requestType, headers: headers, }; } else { options = { method: requestType, headers: headers, body: JSON.stringify(data) }; } console.log("Request Headers:", options.headers); console.log("Start sending a request to API"); const response = await fetch(requestURL, options); ...
Запрос доходит до сервера, но часть заголовка с токеном пуста. Тип запроса Get, это вроде не должно влиять на заголовки. Так же я пробовал вставить просто строку "token" вместо токена на фронтенде, в логи на сервере всё равно выводится Token: (пустой токен). Запрос на сервер, точно доходит, кроме того, запросы не требующие токена работают. Резюме: Бэкенд + Postman полностью работает; Фронтенд + Бэкенд не работает только тогда, когда пересылается токен (не пересылается даже просто строка текста, то есть проблема не в самом токене на фронте). Кроме того, политики CORS на бэке настроены так, что сейчас они принимают запросы со всех доменов, и в браузере ошибок по CORS не возникает. Я допускаю, что мог где-то не там поставить кавычки, но вроде всё что приходило в голову уже проверил
Дополнительно:
А что на это говорят средства разработчика в браузере? Там можно увидеть какой запрос и с какими заголовками уходит. Там-то токен есть?
Вот скрин, как я понимаю тут заголовки выглядят именно так, как и должны.
let r = await fetch('url', { headers: {Authorization: 'Bearer {token}'} }) |
let r = await fetch('url', { headers: {Authorization: 'Bearer {token}'} })
заменить Record на
const headers = new Headers(); headers.append('Content-Type', 'application/json'); |
const headers = new Headers(); headers.append('Content-Type', 'application/json');
Обычно в Headers между парметром и значение ставится двоеточие. Здесь:
Authorization Bearer {{accessToken}}
всё идёт одной строкой. И это у Вас работает.
Поставьте двоеточие, в этом случае обработка будет корректной, т.к. здесь:
context.Request.Headers["Authorization"].
у Вас идёт поиск заголовка "Authorization", а так как его нет, то и выражение:
string? token = context.Request.Headers["Authorization"].FirstOrDefault()?.Replace("Bearer ", "");
возвращает null
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для того чтобы понять, почему токен не приходит на API, необходимо провести анализ всего процесса получения и отправки токена. Важно учитывать несколько возможных причин, которые могут привести к этой проблеме.
1. Проверьте правильность генерации и отправки токена. Убедитесь, что токен генерируется правильно и передается в запросе к API. Проверьте формат и структуру токена, а также метод передачи данных (например, заголовок запроса или параметр URL).
// Пример генерации токена в PHP $token = generateToken(); $headers = array( 'Authorization: Bearer ' . $token );
2. Проверьте настройки безопасности сервера. Некоторые серверы могут блокировать запросы с токенами из-за настроек безопасности. Убедитесь, что сервер разрешает передачу токенов и не блокирует запросы с ними.
3. Проверьте жизненный цикл токена. Возможно, токен истек или был отозван до того, как он был передан на API. Убедитесь, что токен актуален и не истек.
4. Проверьте логи и отладочную информацию. Иногда проблема может быть связана с ошибкой на сервере API или неправильным форматом запроса. Просмотрите логи на стороне сервера API, чтобы выявить возможные ошибки.
5. Проверьте соединение с API. Возможно, проблема связана с недоступностью сервера API или проблемами с сетью. Убедитесь, что ваш сервер может связаться с API и получить ответ.
Если после проведения вышеперечисленных шагов проблема не была решена, рекомендуется обратиться к документации API или к разработчикам API для получения дополнительной информации и помощи в решении проблемы с токеном.