Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Аутентификация и HTTP-заголовок (https://javascript.ru/forum/node-js-io-js/83444-autentifikaciya-i-http-zagolovok.html)

Raadsert 09.12.2021 18:43

Аутентификация и HTTP-заголовок
 
Здравствуйте.

Сейчас разбираюсь с написанием системы авторизации, прочитал множество статей и не могу понять одного момента.

Для подтверждения того что пользователь уже проходил авторизацию создаётся JWT токен и отправляется в клиент.
Сам же токен в дальнейшем берётся из request заголовка HTTP, и главный вопрос в том как именно токен попадает в этот заголовок? Какие то операции должны проходить на стороне клиента?

Видел как некоторые используют перехват из пакета axios, но я не хотел бы загружать проект целым пакетом ради одной функции.

Буду очень благодарен за помощь.

MallSerg 09.12.2021 21:00

>> главный вопрос в том как именно токен попадает в этот заголовок?
Клиент сам добавляет в заголовок.
Обычно помощью специальных функций доступных у клиента.
т.е. клиент специально вызывает функции которые добавляют заголовок к HTTP запросу.

>> Какие то операции должны проходить на стороне клиента?
Клиент должен добавить заголовок и его значение.
Практически во всех видах клиента это выглядит как

создать HTTP_запрос = новый HTTP_запрос();
HTTP_запрос.ДобавитьЗаголово к (ИмяЗаголовка , ЗначениеЗоголовка);
HTTP_запрос.ТекстЗапроса = КакоцтаТекстЗапроса;
HTTP_запрос.Отправить();

Raadsert 10.12.2021 00:42

Цитата:

Сообщение от MallSerg (Сообщение 542317)
>> главный вопрос в том как именно токен попадает в этот заголовок?
Клиент сам добавляет в заголовок.
Обычно помощью специальных функций доступных у клиента.
т.е. клиент специально вызывает функции которые добавляют заголовок к HTTP запросу.

>> Какие то операции должны проходить на стороне клиента?
Клиент должен добавить заголовок и его значение.
Практически во всех видах клиента это выглядит как

создать HTTP_запрос = новый HTTP_запрос();
HTTP_запрос.ДобавитьЗаголово к (ИмяЗаголовка , ЗначениеЗоголовка);
HTTP_запрос.ТекстЗапроса = КакоцтаТекстЗапроса;
HTTP_запрос.Отправить();

Но если какая то операция по присваиванию заголовка проходит через клиент как тогда проверять доступ к определенной странице, не через промежуточную страницу ведь?

Извиняюсь за глупые вопросы, вынужденная мера так как в статьях об операциях со стороны клиента никто не рассказывал.

MallSerg 10.12.2021 04:18

В клиент серверной архитектуре подразумевается что клиент только запрашивает а все операции совершает сервер.

При запросе сервер отвечает что доступ запрещен.
В протоколе http для этого предусмотрены специальные статус коды
https://ru.wikipedia.org/wiki/%D0%A1...%B8%D1%8F_HTTP

Raadsert 10.12.2021 17:48

Цитата:

Сообщение от MallSerg (Сообщение 542325)
В клиент серверной архитектуре подразумевается что клиент только запрашивает а все операции совершает сервер.

При запросе сервер отвечает что доступ запрещен.
В протоколе http для этого предусмотрены специальные статус коды
https://ru.wikipedia.org/wiki/%D0%A1...%B8%D1%8F_HTTP

Это понятно. При запросе доступа к определённой странице на сервер отправляются некоторые данные в том числе и заголовки, если нужного заголовка авторизации с токеном нет, сервер не даёт доступа к странице. На сколько я понял, токен сохраняется в куки а после передаётся в HTTP заголовок, но где и как эти заголовки присваиваются я понять не могу. Если они присваиваются на стороне сервера и там же проверяются, то не понимаю почему тогда просто не взять токен из куки без передачи и повторной проверки на сервере.

Raadsert 09.02.2022 23:19

Цитата:

Сообщение от MallSerg (Сообщение 542325)
В клиент серверной архитектуре подразумевается что клиент только запрашивает а все операции совершает сервер.

При запросе сервер отвечает что доступ запрещен.
В протоколе http для этого предусмотрены специальные статус коды
https://ru.wikipedia.org/wiki/%D0%A1...%B8%D1%8F_HTTP

А вы не могли бы подсказать, как на сервере нужно принимать запросы с присвоенными заголовками?

К примеру у меня в клиенте имеется такой код:
let request = new XMLHttpRequest();
request.open('GET', document.location, false);
request.setRequestHeader('Test', 'token');
request.send(null);
request.getAllResponseHeaders().toLowerCase();


Как на сервере принять этот код и обработать для последующего вывода нужных страниц?

ksa 10.02.2022 09:13

Цитата:

Сообщение от Raadsert
Как на сервере принять этот код и обработать для последующего вывода нужных страниц?

Так смотря какой у тебя сервер... :)
На Node.js принимающая сторона имеет объект request в котором есть ключ headers.
Вот в нем и содержатся все данные заголовка, так же в виде пар ключ-значение...

ksa 10.02.2022 09:19

Raadsert, обработка и доступ к страницам также сильно зависит от того на чем у тебя организован клиент...
Например для Реакт, Вью или Ангулар достаточно изменить нужное состояние, если клиент не авторизован.

Если использовать связку Node.js + его шаблонизатор (например PUG), можно сделать редирект на страничку "вы не авторизованы"...
А с нее можно попасть только на регистрацию.

Т.е. фантазию можно развивать на таких делах. :D

micscr 10.02.2022 09:52

Цитата:

Сообщение от Raadsert (Сообщение 542327)
Это понятно. При запросе доступа к определённой странице на сервер отправляются некоторые данные в том числе и заголовки, если нужного заголовка авторизации с токеном нет, сервер не даёт доступа к странице. На сколько я понял, токен сохраняется в куки а после передаётся в HTTP заголовок, но где и как эти заголовки присваиваются я понять не могу. Если они присваиваются на стороне сервера и там же проверяются, то не понимаю почему тогда просто не взять токен из куки без передачи и повторной проверки на сервере.

Токен не сохраняется в куки.
Эти токены существуют для rest api, а они без состояния, т.е. ни на сессии ни на куки не рассчитывай, с каждым запросом надо тащить нужную инфу о пользователе.

Все работает примерно так:
- клиент хочет обратиться к api
- клиент у себя где то хранит токен доступа, да хоть в переменной какой если это SPA, или в localStorage
- итак, клиент видит что токена нет
- он по api обращается на страницу аутентификации, с именем и паролем, и сервер ему отдает этот токен
- в этом токене будет храниться все достаточное чтобы клиенту залогиниться в api
- вот и получается что достаточно ему с этим токеном в заголовке заходить, на сервере он будет залогинен

Raadsert 10.02.2022 15:41

Цитата:

Сообщение от MallSerg (Сообщение 542325)
В клиент серверной архитектуре подразумевается что клиент только запрашивает а все операции совершает сервер.

При запросе сервер отвечает что доступ запрещен.
В протоколе http для этого предусмотрены специальные статус коды
https://ru.wikipedia.org/wiki/%D0%A1...%B8%D1%8F_HTTP

Цитата:

Сообщение от ksa (Сообщение 543635)
Raadsert, обработка и доступ к страницам также сильно зависит от того на чем у тебя организован клиент...
Например для Реакт, Вью или Ангулар достаточно изменить нужное состояние, если клиент не авторизован.

Если использовать связку Node.js + его шаблонизатор (например PUG), можно сделать редирект на страничку "вы не авторизованы"...
А с нее можно попасть только на регистрацию.

Т.е. фантазию можно развивать на таких делах. :D

У меня Node.js и express, без шаблонизаторов, без "Реакт", "Вью" или "Ангулар". Я вместе с первым запросом к странице, к примеру "/auth", высылаю ответ в качестве пустой страницы с js файлом (в нём код тот что выше) где он формирует заголовок и отправляет его на сервер по текущему адресу, но каким образом на сервере можно получить этот заголовок понять не могу. Обычный запрос app.get никак не реагирует если я повторно отправляю файл html но уже с информацией о заголовке.


Часовой пояс GMT +3, время: 04:53.