Я завершил большую часть проекта, но теперь я застрял с новой проблемой. Мне нужно извлечь токен доступа из запроса, который будет в заголовке в Authentication Basic. Это сбивает с толку, поскольку сначала я использовал простой метод GET и отправлял токен доступа в самом запросе и извлекал его с помощью @RequestParam
. Я задавал аналогичный вопрос раньше, но это был простой запрос из самого запроса, и теперь я должен сделать это из заголовка.
@GetMapping("/persons")
public String loadPersons(@RequestParam("access_token") String access_token) throws ParseException{
String decode_token = pd.testDecodeJWT(access_token);
String token = pd.jsondata(decode_token);
........................ More Code........................
Я хочу получить этот токен из запроса в формате Authentication Basic.
Я попробовал несколько руководств на YouTube, но, поскольку я уже почти полностью сделал свой проект, я хочу внести в него минимальные изменения, чтобы больше не возникало ошибок.
Заранее спасибо
@ m-2127 m-2127 Это был мой самый первый проект Springboot, и я понятия не имел о функциях Springboot. Поскольку мне дали крайний срок, я не смог изучить большую часть этого, включая весеннюю безопасность. Спасибо за вашу помощь.
Чтобы получить значение из заголовка HTTP, вы можете использовать @RequestHeader("headerValue")
.
Но что меня смущает в вашем вопросе, так это то, что вы используете обычную аутентификацию или JWT? Базовая аутентификация относится только к имени пользователя и паролю и не имеет ничего общего с токеном доступа. Требуется заголовок HTTP в формате:
Authorization: Basic <credentials>
где <credentials>
это Base64Encode(username:password)
.
С другой стороны, если вы используете токен доступа, отформатированный в JWT, обычной практикой является использование Bearer
в заголовке «Авторизация»:
Authorization: Bearer <JWT>
Итак, что бы вы ни использовали, я советую использовать @RequestHeader("Authorization")
, чтобы сначала получить значение заголовка Authorization
. Затем декодировать значение в соответствии с вашими фактическими механизмами аутентификации:
@GetMapping("/persons")
public String loadPersons(@RequestHeader("Authorization") String authHeader) throws ParseException{
//decode authHeader
}
Это сработало, но нельзя ли использовать Authentication Basic для JWT? как мой тренер говорит, что они будут использовать Basic для отправки токена jwt в качестве заголовка.
@Chaos просматривает вопрос это stackoverflow и отвечает на него, чтобы прояснить это.
Вы по-прежнему можете отправить JWT с помощью Authorization: Basic <JWT>
, он все равно будет работать, но это не обычная аутентификация, поскольку у базовой аутентификации есть определенные требования к строке после Authorization: Basic
. Также см. это для лучшего типа заголовка авторизации для JWT в обычной практике.
Почему вы не использовали отдельный класс для обработки части аутентификации, которая будет обслуживать все HTTP-запросы, а не обращаться к токену в вашем классе контроллера. Попробуйте использовать пружинную безопасность в своем проекте, которая будет полезна при использовании аутентификации jwt. (Не стесняйтесь изменять код только потому, что вы выполнили большую его часть. Попробуйте использовать лучшие практики и лучшие доступные методы).