Аутентификация и HTTP-заголовок
Здравствуйте.
Сейчас разбираюсь с написанием системы авторизации, прочитал множество статей и не могу понять одного момента. Для подтверждения того что пользователь уже проходил авторизацию создаётся JWT токен и отправляется в клиент. Сам же токен в дальнейшем берётся из request заголовка HTTP, и главный вопрос в том как именно токен попадает в этот заголовок? Какие то операции должны проходить на стороне клиента? Видел как некоторые используют перехват из пакета axios, но я не хотел бы загружать проект целым пакетом ради одной функции. Буду очень благодарен за помощь. |
>> главный вопрос в том как именно токен попадает в этот заголовок?
Клиент сам добавляет в заголовок. Обычно помощью специальных функций доступных у клиента. т.е. клиент специально вызывает функции которые добавляют заголовок к HTTP запросу. >> Какие то операции должны проходить на стороне клиента? Клиент должен добавить заголовок и его значение. Практически во всех видах клиента это выглядит как создать HTTP_запрос = новый HTTP_запрос(); HTTP_запрос.ДобавитьЗаголово к (ИмяЗаголовка , ЗначениеЗоголовка); HTTP_запрос.ТекстЗапроса = КакоцтаТекстЗапроса; HTTP_запрос.Отправить(); |
Цитата:
Извиняюсь за глупые вопросы, вынужденная мера так как в статьях об операциях со стороны клиента никто не рассказывал. |
В клиент серверной архитектуре подразумевается что клиент только запрашивает а все операции совершает сервер.
При запросе сервер отвечает что доступ запрещен. В протоколе 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(); Как на сервере принять этот код и обработать для последующего вывода нужных страниц? |
Цитата:
На Node.js принимающая сторона имеет объект request в котором есть ключ headers. Вот в нем и содержатся все данные заголовка, так же в виде пар ключ-значение... |
Raadsert, обработка и доступ к страницам также сильно зависит от того на чем у тебя организован клиент...
Например для Реакт, Вью или Ангулар достаточно изменить нужное состояние, если клиент не авторизован. Если использовать связку Node.js + его шаблонизатор (например PUG), можно сделать редирект на страничку "вы не авторизованы"... А с нее можно попасть только на регистрацию. Т.е. фантазию можно развивать на таких делах. :D |
Цитата:
Эти токены существуют для rest api, а они без состояния, т.е. ни на сессии ни на куки не рассчитывай, с каждым запросом надо тащить нужную инфу о пользователе. Все работает примерно так: - клиент хочет обратиться к api - клиент у себя где то хранит токен доступа, да хоть в переменной какой если это SPA, или в localStorage - итак, клиент видит что токена нет - он по api обращается на страницу аутентификации, с именем и паролем, и сервер ему отдает этот токен - в этом токене будет храниться все достаточное чтобы клиенту залогиниться в api - вот и получается что достаточно ему с этим токеном в заголовке заходить, на сервере он будет залогинен |
Цитата:
Цитата:
|
Raadsert, есть подозрение что ты просто говнокодишь...
Как вариант сделай простенькую модель сайта. На ней можно буде лучше понять чего ты так гоношишь. |
Raadsert, вот почитай доку...
https://nodejsdev.ru/doc/request-object/ Вот пример авторизации... https://nodejsdev.ru/doc/jwt/ |
Цитата:
app.use(express.static(`${__dirname}/auth`), (req, res, next) => { res.status(200).sendFile(path.resolve(__dirname, 'auth', 'index.html')); next() }) app.use(express.static(`${__dirname}/auth`), (req, res, next) => { if (req.headers.test) { req.user = req.headers.test next() } next() }) app.get('/auth', (req, res) => { if (req.user) return res.status(200).send(`<h1>${req.user}</h1>`); else return res.status(200).send(`<h1>None</h1>`); }) index.html загружает скрипт XML. До этого загружал файл в app.get . Подскажите, что я делаю не так? |
Цитата:
|
Raadsert, такую вот статейку почитай...
https://medium.com/nuances-of-progra...s-80915da83c60 |
Цитата:
let request = new XMLHttpRequest(); request.open('GET', document.location, false); request.setRequestHeader('test', 'test-info'); request.send(null); request.getAllResponseHeaders().toLowerCase(); Вот тут, если заголовок существует, он должен передать его к req.user: app.use(express.static(`${__dirname}/auth`), (req, res, next) => { if (req.headers.test) { req.user = req.headers.test next() } next() }) После чего в app.get, если req.user существует, вместо обычной страницы index.html вывести информацию из http-заголовка "<h1>${req.user}</h1>": app.get('/auth', (req, res) => { if (req.user) return res.status(200).send(`<h1>${req.user}</h1>`); else return res.status(200).send(`<h1>None</h1>`); }) Дело в том что последняя часть не возвращает h1 с каким бы то ни было значением. Почему так происходит, и как вернуть результат присваиваемого http-заголовка через сервер обратно в клиент? p.s. На сколько я понял так и работает система аутентификации, только клиент отправляет jwt-токен на сервер (вместо заголовка "test": "test-info"), он сравнивает токен с тем что хранится у него и при положительном результате отправляет клиенту некую информацию с ограниченным доступом (в случае выше это просто h1 с информацией из http-заголовка "test"). |
Raadsert, я тебе статейку выше для чего дал?
Для начала просто почитай для чего Цитата:
Цитата:
Цитата:
Т.е. просто писать аглицкие слова в произвольном порядке - не значит программировать. |
Цитата:
express.staticиспользуется совместно с "use" для указания директории статичных файлов, я знаю. res.status(200).sendFile(...)"sendFile" используется для отправки файлов в клиент, иначе как мне доставить скрипт на сторону клиента?! Дело в том что я неправильно указал статут ответа? Я всё прочитал, но всё равно не могу понять. Единственное что мне приходит в голову это то что ответ с сервера я должен обрабатывать скриптом на стороне клиента и все передаваемые сервером данные размещать при помощи скрипта. |
Что-то туго идет... :(
Как только ты объявил некую директорию через express.static, файлы из нее будет отправлять сам экспресс... Как только что-то отправили клиенту - вся твоя дальнейшая "обработка" теряет всякий смысл. Если ты хочешь что-то взять из заголовка и запихать его куда-то - это нужно делать после основных обработчиков/парсеров экспресс. Вот тебе еще ссылочка на доку про сам экспресс https://expressjs.com/ru/guide/routing.html |
Цитата:
|
Цитата:
Цитата:
Для работы с заголовками можно использовать промежуточные обработчики https://expressjs.com/ru/guide/writing-middleware.html После ПО нужно правильно обработать сам запрос... Это уже по предыдущей ссылке (маршрутизация) можно будет сделать, добавив обработку полученных данных из заголовка. |
Цитата:
|
Raadsert, тут кагбэ нужно разделить задачи и определиться что и в какой последовательности ты собираешься делать... :blink:
У тебя уже фигурируют несколько слов в непонятной для меня последовательности. Это: - файл - заголовок - ответ - реквест - клиент - скрипт |
Цитата:
p.s Клиент это ведь сам сайт, то есть, та часть что сервер отправляет в качестве index.html со встроенными скриптами и является клиентом, верно? |
Цитата:
Я тебе для чего давал ссылку на роутинг? Роутинг он кагбэ много возможностей имеет. :) Вот ты и должен с ним определиться. Если нужно вернуть статику - это можно сделать используя express.static... Обработать заголовки - простым промежуточным обработчиком... А отправить запрос со статики можно либо поменяв метод, либо весь УРЛ. Фантазию нужно развивать и учебники читать. Доки они кагбэ уже для понимающих написаны. Если понимания нет - нужно учебники читать. Там и примеров будет много показано. В противном случае ты так и будешь ходить "кругами". :( |
Цитата:
Мне просто при помощи роутеров создавать заголовок? Мне кажется это бессмысленным если речь идёт о передаче в заголовке токена. Я создавал заголовок через XML после того как загрузится страница на которую был осуществлён переход, это не правильный способ? Дело в том что я наблюдал за тем как этот процесс проходит в админ-системе strapi, и у них на страницу загружались данные уже после загрузки сайта, без редиректов. Можете пожалуйста написать небольшой пример как это работает? Мне так будет понятнее. |
Цитата:
https://www.youtube.com/watch?v=tKM44vPHU0U А продолжить уже этим https://www.youtube.com/watch?v=243pQXC5Ebs На учебники ссылку дать более проблематично и они датируются довольно не свежими годами. Но постараюсь найти... Цитата:
А вот заголовки приходят как часть самого запроса. Цитата:
https://www.youtube.com/watch?v=fN25fMQZ2v0 Там будет все. Про токены и заголовки... ;) |
Цитата:
https://ru.pdfdrive.com/nodejs-в-д...148600761.html Или вот такая книжка... https://ru.pdfdrive.com/front-end-К...e53632633.html |
Цитата:
|
Цитата:
Главное назначение моих ссылок - довести до тебя идеологию всего этого хозяйства. Ее многогранность. Чтобы ты "не тыкал палкой в одно место", а мог широко использовать возможности этой клиент-серверной технологии. |
Цитата:
|
Цитата:
Серверный скрипт имеет доступ к т.н. req... Это объект запроса. Там довольно много чего можно узнать "о пользователе"... Так же есть объект process. https://nodejsdev.ru/api/process/#uncaughtexception Полного списка я особо и не искал... :blink: Если какая-то надобность появлялась - выводил ключи и анализировал "что в них есть". А что именно "о пользователе" ты хотел узнать? В учебниках, как правило, рассказывали о некоторых данных и не более того... |
Цитата:
|
Цитата:
|
Часовой пояс GMT +3, время: 01:55. |