Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Веселая аркада с Печенькой для новогоднего настроения. Объезжайте препятствия, а подарки, варежки, конфеты и прочие приятности не объезжайте: они помогут набрать очки и установить новый рекорд.

Сноуборд

Спорт, Аркады, На ловкость

Играть

Топ прошлой недели

  • dec300z dec300z 11 постов
  • AlexKud AlexKud 43 поста
  • DashaAshton DashaAshton 7 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
0 просмотренных постов скрыто
Вопрос из ленты «Эксперты»
KetorpEvec
8 месяцев назад

Взываю к Javaистам Пикабу...⁠⁠

private <T> getJSONurl(String url) {
ResponseEntity<String> responseEntity = restTemplate.getForEntity(url, String.class);
String jsonString = responseEntity.getBody();
try {
Gson g = new Gson();
<T> = g.fromJson(jsonString, <T>.class);
} catch (IllegalStateException e) {
//return("Данные JSON имеют неверный формат");

System.out.println("Данные JSON имеют неверный формат"); // исправление
}
} - помгите что тут не так? Недавно углубляюсь в JAVA. Нужно дать URL и Class оно должно возвращать Class... Без Generic-ов в коде работает. Приходится такое часто вызывать.

[моё] Вопрос Спроси Пикабу Java Rest Программирование Текст
10
31
antexdom
antexdom
1 год назад
Arduino & Pi
Серия Контроллер интернет вещей AntexGate

HTTP <AntexGate> Modbus конвертор Linux⁠⁠

HTTP <AntexGate> Modbus конвертор Linux

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

В мире промышленной автоматизации интерфейсы HMI устарели, выглядят пугающе и бытует мнение, что чем дороже программно-аппаратный комплекс, тем лучше он будет работать. Молодёжь, которая умеет рисовать красивые "WEB-морды" в этот бизнес не суется, всех пугает так называемые Machine to machine протоколы и интерфейсы, индустрия обросла опытными мужиками, которые понимают как выглядит два байта данных в одном регистре Modbus.

Итак статья для тех, кто столкнулся с задачей преобразовать Modbus RTU TCP в протокол HTTP, который уже можно вытянуть на любую красочную "web-морду", либо другой сервис.

Представим, что вы пришли на производство, в котором уже стоят промышленные приборы - датчики температуры, станки, принимающие\передающие данные по протоколу Modbus RTU TCP, а Вам нужно закинуть некоторые данные в систему мониторинга. Действительно подавляющее большинство систем мониторинга не смогут опросить устройства по Modbus без специального программно-аппаратного шлюза.

Предлагаем бесплатное программное обеспечение Node-Red и контроллер AntexGate и получаем мощный программно-аппаратный комплекс для преобразования различных протоколов. В предыдущей статье мы уже рассмотрели конвертацию ModbusTCP2ModbusRTU.

Первое, что необходимо – это установить программный продукт Node-Red, это делается одним скриптом:

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/...)

Сделать Node-Red после установки сервисом:

sudo systemctl enable nodered.service

Перезагружаем "железяку":

sudo reboot

Теперь попадаем в среду нашего программного конвертора Node-Red через web браузер по ссылке ip шлюза:1880

В настройках справа устанавливаем плагин node-red-contrib-modbus.

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

Установка node-red-contrib-modbus

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

Установка node-red-contrib-modbus

После того, как плагин установлен приступаем к настройке, делается это так же просто из web интерфейса. Нажимаем кнопку меню, импорт, примеры, Modbus-HTTP, импорт.

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

Импортируем пример Modbus-HTTP

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

Импортируем пример Modbus-HTTP

Итак, настройка почти закончилась, нам остается настроить наши модули опроса и записи на нужные параметры Modbus соединения.

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

Настройка Modbus RTU

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

Настройка Modbus RTU узел чтения 4 регистров, начина с 512

Итак мы настраиваем все 4 узла. В моем случае это опрос Modbus RTU устройства с параметрами аппаратного порта /dev/ttyRS485-1 115200 - 8 - 1 - N. Еще 2 узла отвечают за автоматическое чтение из предустановленных регистров, поэтому я сразу настроил чтение массива 4х регистров начиная с 512, функцией (3) Read Holding Register. Кстати не забудьте собственно подключить конечное устройство к RS485 шине.

Теперь в блоке комментариев вы можете встретить rest API для взаимодействия, ниже с ними познакомимся.

## Read

### Flex Read

http://ip:1880/modbus/flex/read?value=0&unitid=1&fc=3&address=0&quantity=1 http://ip:1880/modbus/flex/read?value=0&unitid=1&fc=4&address=0&quantity=1 http://ip:1880/modbus/flex/read?value=0&unitid=1&fc=3&address=0&quantity=5 http://ip:1880/modbus/flex/read?value=0&unitid=1&fc=4&address=0&quantity=5 ### Read http://ip:1880/modbus/read ## Write ### Test HTTP without Modbus http://ip:1880/modbus/flex/write/test?value=[1,2,3,4,5]&unitid=1&fc=16&address=0&quantity=5 ### Flex Write

http://ip:1880/modbus/flex/write?value=10&unitid=1&fc=6&address=0&quantity=1 http://ip:1880/modbus/flex/write?value=[1,2,3,4,5]&unitid=1&fc=16&address=0&quantity=5 ###

Write

http://ip:1880/modbus/write

Мне были интересны пару запросов, которые прекрасно сработали.

Сначала тестируем функцию записи - пишем значение 123 в Modbus RTU устройство с адресом 16 функцией 6 в регистр 512 ну и длина записи 1 значение. Можно писать и сразу массивы функцией 16 например [1,2,3,4,5] тогда и длина записи соответственно 5.

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

HTTP запрос записи

Теперь проверим, записалось ли наше значение в нужное адресное пространство и прочитаем состояние 5-ти регистров начиная с 512 функцией 3.

HTTP <AntexGate> Modbus конвертор Linux Linux, Информационная безопасность, Программа, Raspberry pi, Nodejs, Http, Rest, Длиннопост

HTTP запрос чтения

Как видим значение записалось. Теперь мы можем внедрить наши данные в любое web приложение.

ВНИМАНИЕ: в таким виде без авторизации ни в коем случае не пускаем в интернет и обязательно создаем как минимум связку логин + пароль.

Контроллер AntexGate в связке с Node-Red или другим софтом является отличным универсальным решением для обработки, пересылки и хранения данных. Прошу прощения за рекламу, однако выше представленный проект Вы можете реализовать на любом "железе" и любой ОС.

Присоединяйтесь к нашему сообществу в Telegram обсудим свободно программируемые продукты.

"Железо" можно получить на тесты, пишите на почту: info@antexcloud.ru (на три месяца для ЮР лиц и ИП)

Показать полностью 9
[моё] Linux Информационная безопасность Программа Raspberry pi Nodejs Http Rest Длиннопост
22
3
Wowovideo
Wowovideo
1 год назад
ITmozg

Развивающийся ландшафт протоколов API⁠⁠

Обзор шести самых популярных протоколов API

REST

Webhooks

GraphQL

SOAP

WebSocket

gRPC

https://blog.postman.com/api-protocols-in-2023/

источник https://t.me/itmozg/9692

Развивающийся ландшафт протоколов API Программист, IT, API, Rest, Программирование, Linux, Python, Telegram (ссылка)
Показать полностью 1
Программист IT API Rest Программирование Linux Python Telegram (ссылка)
2
6
bertramvays
bertramvays
2 года назад
Программирование на python

Прошу помощи в разьяснении тестового задания на долность Python-разработчика⁠⁠

Добрый день, уважаемые форумчане.
Несколько дней назад, в поисках ответа на вопрос я попал на страницу с вопросом годичной давности одного пользователя, в которой он искал ментора, потому что сам не мог решить свой вопрос. В коментариях ему посоветовали выложить все задание здесь на pikabu. По причине отзывчивости и доброжелательного отношения пользователей я решил выложить свой вопрос, в надежде получить ответы.

Я рассылаю резюме на вакансию Python-разработчика, и получил тестовое задание. Хотя уже понимаю, что знаний моих не достаточно и нужно еще учиться и скорее всего в эту компанию меня не возьмут, но считаю обязаностью все тестовые задания решать . По причине самостоятельного обучения прошу строго не судить за вопросы, ответы на которые могут показаться очевидные.

И так задание:

Необходимо создать сервер авторизации и новостей с комментариями и лайками на Django с использованием RestFramework на python 3.

  • У каждого пользователя может быть две роли – пользователь и админ, админ может зайти в админ-панель, пользователь – нет. Как именно решить эту задачу не принципиально. Плюсом будет создание кастомного класса для авторизации наследуемого от BaseAuthentication - нам важно видеть как вы решите эту задачу.

  • Каждый пользователь может создать новость. Все пользователи могут получать списки всех новостей с пагинацией. Пользователи могут удалять и изменять свои новости. Админ может удалять и изменять любую новость.

  • Также нужно добавить механизм лайков и комментариев новостей – лайкать и комментировать может любой пользователь, автор может удалять комментарии к своим новостям, админ может удалять любые комментарии.
    При получении списка новостей и одной конкретной новости нужно показать количество лайков и комментариев. Плюсом будет добавление списка последних 10 комментариев при получении списка новостей и одной новост.
    Плюсом будет реализация механизма через микросервис.

Исходный код приложения необходимо выложить на GitLab или GitHub и запустить сервер. Сервер должен быть доступен для запросов из внешней сети, доступ к серверу (IP или доменное имя) а также роут для доступа к АПИ должны быть в README.md репозитория.

Краткий мануал по созданию виртуального сервера на базе яндекс.облака для новых пользователей даётся бесплатный период использования:
https://cloud.yandex.ru/docs/compute/quickstart/quick-create-linux

Также бесплатный сервер t2 micro можно поднять на Amazone:
https://us-east-2.console.aws.amazon.com/ec2/v2/home

  • Желательно:

  • контейнеризация в Docker

  • использование python venv

  • использование web сервера CherryPy, gunicorn и им подобных (какого-нибудь одного)

  • демонстрация понимание механизма миграций моделей (можно сделать несколько изменений в какой-либо модели и показать миграции)

  • использование .env файла для хранения информации о подключении к базе данных

  • файл README.md с описанием скриптов для разворачивания окружения и запуска сервера

    Модели:

  • Users (имя пользователя, пароль в зашифрованном виде)

  • News (дата новости, заголовок новости, текст новости, автор)

  • Comments (Дата комментария, текст комментария, автор)

  • Опционально: Tokens (при авторизации можно создавать токены и хранить их в базе или использовать JWT токены)

    Роуты

  • POST auth (передаем имя пользователя и пароль, получаем токен если пользователь с таким паролем есть и ошибку, если такого пользователя нет)

  • GET news (получаем список новостей с пагинацией)

  • POST news (создаем новость, проверка на авторизацию)
    PUT news (обновляем новость, проерка на атворизацию, проверка на наличие прав)

  • DELETE news

  • GET comments (получение списка комментариев новости с пагинацией)

  • POST comments (создание нового комментария, проверка на авторизацию)

  • DELETE comments

    Админка

  • Нужна стандартная админка Django (пользователи админки могут не пересекаться с пользователями в таблице Users)

Что мне непонятно:

1. Первое на чем я застрал это модель Users. Что мне нужно делать, использовать встроенную модель Django - User или создавать свою? Можно расширить джанговскую или создать прокси модель. Но я не понимаю, как хранить пароль, какой тип поля выбирать для этого? На даном этапе я создал модель News c полем ForeignKey(User).

2. Правильно ли я понял, что для выполнения задания создавать html-шаблон для отображения новостей не нужно? Хотя наверное это будет плюсом.

3. Для реализации механизмов коментариев и лайков в качестве микросервиса, нужно создать его как отдельное Django-приложение, а потом оформить как пакет и выкладывать на отдельном сервере?

4. В начале я пытался в качестве веб-сервера прикрутить CherryPY, но нашел только инструкции 10-летней давности. В итоге запускаю через Gunicorn, для него инструкция в документации Django. После запуска в админке Django, не отображалась статика, поэтому я установил Nginx. Это правильная последовательность действий или нужно было по другому делать?

5. Когда я сделаю проект, Nginx нужно устанавливать в Docker с остальными зависимостями? Создание докер-образа это одна задача, а разворачивание на сервере другая, или можно этот образ развернуть на сервере?

6. Еще читал, что плохая практика пихать в один образ Django-проект и БД, как лучше поступить в моем случае?

Заранее спасибо за ответы.

P.S. я откликался на вакансию Мидла, поэтому вариант задавать все эти вопросы рекрутеру с последующей переадресацией спецам я не рассматривал.

Показать полностью
Python Джанго Rest Программирование Длиннопост Текст
12
3
hunterpo
hunterpo
2 года назад
Офисные будни

Резюме⁠⁠

Резюме сегодня читал.

Сперва подумал, что человек перепутал раздел навыки и хобби, а потом как понял...

Резюме IT, Резюме, Rest
[моё] IT Резюме Rest
4
3
cafenglish
cafenglish
3 года назад

Учим английский! Пять советов как провести семейный отдых на пять⁠⁠

Я преподаватель английского - веду свой видеоблог. Сегодня новая серия "HOW TO" посвящена семейному отдыху. Надеюсь будет интересно и подтянет ваш английский. Чтоб не было скучно, видео разбавлено веселыми скетчами. В ролях - вся моя семья. Видео с субтитрами, говорю в среднем темпе, с четкой дикцией, чтоб было понятно даже начинающим.

[моё] Rest Путешествия Free Time Семейный отдых Английский язык Видео
0
55
noopel
noopel
3 года назад
Лига программистов

Разработка системы заметок с нуля. Часть 2: REST API для RESTful API Service + JWT + Swagger⁠⁠

Продолжаем серию материалов про создание системы заметок. В этой части мы спроектируем и разработаем RESTful API Service на Go cо Swagger и авторизацией. Будет много кода, ещё больше рефакторинга и даже немного интеграционных тестов.

В первой части мы спроектировали систему и посмотрели, какие сервисы требуются для построения микросервисной архитектуры.


Исходники проекта — в репозитории на GitHub.


Подробности в видео и текстовой расшифровке под ним.

Прототипирование


Начнём с макетов интерфейса. Нам нужно понять, какие ручки будут у нашего API и какой состав данных он должен отдавать. Макеты мы будем делать, чтобы понять, какие сущности, поля и эндпоинты нам нужны. Используем для этого онлайн-сервис NinjaMock. Он подходит, если макет надо сделать быстро и без лишних действий.

Страницу регистрации сделаем простую, с четырьмя полями: Name, Email, Password и Repeat Password. Лейблы делать не будем, обойдемся плейсходерами. Авторизацию сделаем по юзернейму и паролю.

После входа в приложение пользователь увидит список заметок, который будет выглядеть примерно так:

Разработка системы заметок с нуля. Часть 2: REST API для RESTful API Service + JWT + Swagger API, Программирование, Golang, Python, Mockup, Rest, Видео, Длиннопост

Интерфейс, который будет у нашего веб-приложения:

- Слева — список категорий любой вложенности.

- Справа — список заметок в виде карточек, который делится на два списка: прикреплённые и обычные карточки.

- Каждая карточка состоит из заголовка, который урезается, если он очень длинный.

- Справа указано, сколько секунд/минут/часов/дней назад была создана заметка.

- Тело заголовка — отрендеренный Markdown.

- Панель инструментов. Через неё можно изменить цвет, прикрепить или удалить заметку.


Тут важно отметить, что файлы заметки мы не отображаем и не будем запрашивать у API для списка заметок.


Полная карточка открывается по клику на заметку. Тут можно сразу отобразить полностью длинный заголовок. Высота заметки зависит от количества текста. Для файлов появляется отдельная секция. Мы их будем получать отдельным асинхронным запросом, который не помешает пользователю редактировать заметку. Файлы можно скачать по ссылке, также есть отдельная кнопка на добавление файлов.

Разработка системы заметок с нуля. Часть 2: REST API для RESTful API Service + JWT + Swagger API, Программирование, Golang, Python, Mockup, Rest, Видео, Длиннопост

Так будет выглядеть открытая заметка


В ходе прототипирования стало понятно, что в первой части мы забыли добавить еще один микросервис — TagsService. Он будет управлять тегами.


Определение эндпоинтов


Для страниц авторизации и регистрации нам нужны эндпоинты аутентификации и регистрации соответственно. В качестве аутентификации и сессий пользователя мы будем использовать JWT. Что это такое и как работает, разберём чуть позднее. Пока просто запомните эти 3 буквы.

Для страницы списка заметок нам нужны эндпоинты /api/categories для получения древовидного списка категорий и /api/notes?category_id=? для получения списка заметок текущей категории. Перемещаясь по другим категориям, мы будем отдельно запрашивать заметки для выбранной категории, а на фронтенде сделаем кэш на клиенте. В ходе работы с заметками нам нужно уметь создавать новую категорию. Это будет метод POST на URL /api/categories. Также мы будем создавать новый тег при помощи метода POST на URL /api/tags.

Разработка системы заметок с нуля. Часть 2: REST API для RESTful API Service + JWT + Swagger API, Программирование, Golang, Python, Mockup, Rest, Видео, Длиннопост

Чтобы обновить заметку, используем метод PATCH на URL /api/notes/:uuid с измененными полями. Делаем PATCH, а не PUT, потому что PUT требует отправки всех полей сущности по спецификации HTTP, а PATCH как раз нужен для частичного обновления. Для отображения заметки нам ещё нужен эндпоинт /api/notes/:uuid/files с методами POST и GET. Также нам нужно скачивать файл, поэтому сделаем метод GET на URL /api/files/:uuid.

Разработка системы заметок с нуля. Часть 2: REST API для RESTful API Service + JWT + Swagger API, Программирование, Golang, Python, Mockup, Rest, Видео, Длиннопост

Структура репозитория системы


Ещё немного общей информации. Структура репозитория всей системы будет выглядеть следующим образом:

Разработка системы заметок с нуля. Часть 2: REST API для RESTful API Service + JWT + Swagger API, Программирование, Golang, Python, Mockup, Rest, Видео, Длиннопост

В директории app будет исходный код сервиса (если он будет). На уровне с app будут другие директории других продуктов, которые используются с этим сервисом, например, MongoDB или ELK. Продукты, которые будут использоваться на уровне всей системы, например, Consul, будут в отдельных директориях на уровне с сервисами.


Разработка сервиса


Писать будем на Go


- Идём на официальный сайт.

- Копируем ссылку до архива, скачиваем, проверяем хеш-сумму.

- Распаковываем и добавляем в переменную PATH путь до бинарников Go

- Пишем небольшой тест проверки работоспособности, собираем бинарник и запускаем.


Установка завершена, всё работает


Теперь создаём проект. Структура стандартная:

- build — для сборок,

- cmd — точка входа в приложение,

- internal — внутренняя бизнес-логика приложения,

- pkg — для кода, который можно переиспользовать из проекта в проект.


Я очень люблю логировать ход работы приложения, поэтому перенесу свою обёртку над логером logrus из другого проекта. Основная функция здесь Init, которая создает логер, папку logs и в ней файл all.log со всеми логами. Кроме файла логи будут выводиться в STDOUT. Также в пакете реализована поддержка логирования в разные файлы с разным уровнем логирования, но в текущем проекте мы это использовать не будем.


APIService будет работать на сокете. Создаём роутер, затем файл с сокетом и начинаем его слушать. Также мы хотим перехватывать от системы сигналы завершения работы. Например, если кто-то пошлёт приложению сигнал SIGHUP, приложение должно корректно завершиться, закрыв все текущие соединения и сессии. Хотел перехватывать все сигналы, но линтер предупреждает, что os.Kill и SIGSTOP перехватить не получится, поэтому их удаляем из этого списка.


Теперь давайте добавим сразу стандартный handler для метрик. Я его копирую в директорию pkg, далее добавляю в роутер. Все последующие роутеры будем добавлять так же.

Далее создаём точку входа в приложение. В директории cmd создаём директорию main, а в ней — файл app.go. В нём мы создаём функцию main, в которой инициализируем и создаём логер. Роутер создаём через ключевое слово defer, чтобы метод Init у роутера вызвался только тогда, когда завершится функция main. Таким образом можно выполнять очистку ресурсов, закрытие контекстов и отложенный запуск методов. Запускаем, проверяем логи и сокет, всё работает.

Но для разработки нам нужно запускать приложение на порту, а не на сокете. Поэтому давайте добавим запуск приложения на порту в наш роутер. Определять, как запускать приложение, мы будем с помощью конфига.


Создадим для приложения контекст. Сделаем его синглтоном при помощи механизма sync.Once. Пока что в нём будет только конфиг. Контекст в виде синглтона создаю исключительно в учебных целях, впоследствии он будет выпилен. В большинстве случаев синглтоны — необходимое зло, в нашем проекте они не нужны. Далее создаём конфиг. Это будет YAML-файл, который мы будем парсить в структуру.


В роутере мы вытаскиваем из контекста конфиг и на основании listen.type либо создаем сокет, либо вешаем приложение на порт. Код graceful shutdown выделяем в отдельный пакет и передаём на вход список сигналов и список интерфейсов io.Close, которые надо закрывать. Запускаем приложение и проверяем наш эндпоинт heartbeat. Всё работает. Давайте и конфиг сделаем синглтоном через механизм sync.Once, чтобы потом безболезненно удалить контекст, который создавался в учебных целях.


Теперь переходим к API. Создаём эндпоинты, полученные при анализе прототипов интерфейса. Тут важно отметить, что у нас все данные привязаны к пользователю. На первый взгляд, все ручки должны начинаться с пользователя и его идентификатора /api/users/:uuid. Но у нас будет авторизация, иначе любой пользователь сможет программно запросить заметки любого другого пользователя. Авторизацию можно сделать следующим образом: Basic Auth, Digest Auth, JSON Web Token, сессии и OAuth2. У всех способов есть свои плюсы и минусы. Для этого проекта мы возьмём JSON Web Token.


Работа с JSON Web Token


JSON Web Token (JWT) — это JSON-объект, который определён в открытом стандарте RFC 7519. Он считается одним из безопасных способов передачи информации между двумя участниками. Для его создания необходимо определить заголовок (header) с общей информацией по токену, полезные данные (payload), такие как id пользователя, его роль и т.д., а также подписи (signature).


JWT использует преимущества подхода цифровой подписи JWS (Signature) и кодирования JWE (Encrypting). Подпись не даёт кому-то подделать токен без информации о секретном ключе, а кодирование защищает от прочтения данных третьими лицами. Давайте разберёмся, как они могут нам помочь для аутентификации и авторизации пользователя.


Аутентификация — процедура проверки подлинности. Мы проверяем, есть ли пользователь с полученной связкой логин-пароль в нашей системе.


Авторизация — предоставление пользователю прав на выполнение определённых действий, а также процесс проверки (подтверждения) данных прав при попытке выполнения этих действий.

Другими словами, аутентификация проверяет легальность пользователя. Пользователь становится авторизированным, если может выполнять разрешённые действия.


Важно понимать, что использование JWT не скрывает и не маскирует данные автоматически. Причина использования JWT — проверка, что отправленные данные были действительно отправлены авторизованным источником. Данные внутри JWT закодированы и подписаны, но не зашифрованы. Цель кодирования данных — преобразование структуры. Подписанные данные позволяют получателю данных проверить аутентификацию источника данных.


Реализация JWT в нашем APIService:

- Создаём директории middleware и jwt, а также файл jwt.go.

- Описываем кастомные UserClaims и сам middlware.

- Получаем заголовок Authorization, оттуда берём токен.

- Берём секрет из конфига.

- Создаём верификатор HMAC.

- Парсим и проверяем токен.

- Анмаршалим полученные данные в модель UserClaims.

- Проверяем, что токен валидный на текущий момент.


При любой ошибке отдаём ответ с кодом 401 Unauthorized. Если ошибок не было, в контекст сохраняем ID пользователя в параметр user_id, чтобы во всех хендлерах его можно было получить. Теперь надо этот токен сгенерировать. Это будет делать хендлер авторизации с методом POST и эндпоинтом /api/auth. Он получает входные данные в виде полей username и password, которые мы описываем отдельной структурой user. Здесь также будет взаимодействие с UserService, нам надо там искать пользователя по полученным данным. Если такой пользователь есть, то создаём для него UserClaims, в которых указываем все нужные для нас данные. Определяем время жизни токена при помощи переменной ExpiresAt — берём текущее время и добавляем 15 секунд. Билдим токен и отдаём в виде JSON в параметре token. Клиента к UserService у нас пока нет, поэтому делаем заглушку.


Добавим в хендлер с heartbeat еще один тестовый хендлер, чтобы проверить работу аутентификации. Пишем небольшой тест. Для этого используем инструмент sketch, встроенный в IDE. Делаем POST-запрос на /api/auth, получаем токен и подставляем его в следующий запрос. Получаем ответ от эндпоинта /api/heartbeat, по истечении 5 секунд мы начнём получать ошибку с кодом 401 Unauthorized.


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


Чтобы этого избежать, прикрутим refresh-токен. Он позволит пересоздать основной токен доступа без запроса данных авторизации пользователя. Такие токены живут очень долго или вообще бессрочно. После того как только старый JWT истекает мы больше не можем обратиться к API. Тогда отправляем refresh-токен. Нам приходит новая пара токена доступа и refresh-токена.

Хранить refresh-токены на сервере мы будем в кэше. В качестве реализации возьмём FreeCache. Я использую свою обёртку над кэшем из другого проекта, которая позволяет заменить реализацию FreeCache на любую другую, так как отдает интерфейс Repository с методами, которые никак не связаны с библиотекой.


Пока рассуждал про кэш, решил зарефакторить существующий код, чтобы было удобней прокидывать объекты без dependency injection и синглтонов. Обернул хендлеры и роутер в структуры. В хендлерах сделал интерфейс с методом Register, которые регистрируют его в роутере. Все объекты теперь инициализируются в main, весь роутер переехал в мейн. Старт приложения выделили в отдельную функцию также в main-файле. Теперь, если хендлеру нужен какой-то объект, я его просто буду добавлять в конструктор структуры хендлера, а инициализировать в main. Плюс появилась возможность прокидывать всем хендлерам свой логер. Это будет удобно когда надо будет добавлять поле trace_id от Zipkin в строчку лога.

Вернемся к refresh_token. Теперь при создании токена доступа создадим refresh_token и отдадим его вместе с основным. Сделаем обработку метода PUT для эндпоинта /api/auth, а в теле запроса будем ожидать параметр refresh_token, чтобы сгенерировать новую пару токена доступа и refresh-токена. Refresh-токен мы кладём в кэш в качестве ключа. Значением будет user_id, чтобы по нему можно было запросить данные пользователя у UserService и сгенерировать новый токен доступа. Refresh-токен одноразовый, поэтому сразу после получения токена из кэша удаляем его.


Описание API


Для описания нашего API будем использовать спецификацию OpenAPI 3.0 и Swagger — YAML-файл, который описывает все схемы данных и все эндпоинты. По нему очень легко ориентироваться, у него приятный интерфейс. Но описывать вручную всё очень муторно, поэтому лучше генерировать его кодом.


- Создаём эндпоинты /api/auth с методами POST и PUT для получения токена по юзернейму и паролю и по Refresh-токену соответственно.

- Добавляем схемы объектов Token и User.

- Создаём эндпоинты /api/users с методом POST для регистрации нового пользователя. Для него создаём схему CreateUser.


Понимаем, что забыли сделать хендлер для регистрации пользователя. Создаём метод Signup у хенлера Auth и структуру newUser со всеми полями для регистрации. Генерацию JWT выделяем в отдельный метод, чтобы можно было его вызывать как в Auth, так и в Signup-хендлерах. У нас всё еще нет UserService, поэтому проставляем TODO. Нам надо будет провалидировать полученные данные от пользователя и потом отправить их в UserService, чтобы он уже создал пользователя и ответил нам об успехе. Далее вызываем функцию создания пары токена доступа и refresh-токена и отдаём с кодом 201.


У нас есть подсказка в виде Swagger-файла. На его основе создаём все нужные хендлеры. Там, где вызов микросервисов, будем проставлять комментарий с TODO.


Создаём хендлер для категорий, определяем URL в константах. Далее создаём структуры. Опираемся на Swagger-файл, который создали ранее. Далее создаём сам хендлер и реализуем метод Register, который регистрирует его в роутере. Затем создаём методы с логикой работы и сразу пишем тест API на этот метод. Проверяем, находим ошибки в сваггере. Таким образом мы создаём все методы по работе с категориями: получение и создание.


Далее создаём таким же образом хендлер для заметок. Понимаем, что забыли методы частичного обновления и удаления как для заметок, так и для категорий. Дописываем их в Swagger и реализуем методы в коде. Также обязательно тестируем Swagger в онлайн-редакторе.

Здесь надо обратить внимание на то, что методы создания сущности возвращают код ответа 201 и заголовок Location, в котором находится URL для получения сущности. Оттуда можно вытащить идентификатор созданной сущности.


В третьей части мы познакомимся с графовой базой данных Neo4j, а также будем работать над микросервисами CategoryService и APIService.

Показать полностью 5
[моё] API Программирование Golang Python Mockup Rest Видео Длиннопост
4
PoMaHcKu
5 лет назад
Web-технологии

Домашний проект - ищем фронта⁠⁠

Привет всем. Несмотря на то, что первый пост закидали минусами я (а точнее уже мы не) не сдаёмся.

Ищем junior frontend разработчика, у которого есть желание написать своё web приложение с целью добавления в свой репозиторий чего-то приличного. Пока что в обсуждении мы остановились на сервисе онлайн заказа услуги (сама услуга не важна в данный момент и может быть как заказом грузчиков на выезд, заказом доставки еды и тп).

Архитектура — стандартный MVC. Backend на java (Spring boot, mvc, data, security), БД postgre. На фронт передаем json. Хотелось бы чтобы фронт работал с ajax запросами, остальное на ваш вкус и цвет.

Функционал. Регистрация/авторизация, вывод услуг и их сортировка по параметрам, заказ услуги, уведомление на email о заказе.

Итого, если ты front junior, учишь js и хочешь пополнить своё резюме небольшим проектом добро пожаловать в телеграм (в комментах).

Нас уже трое: devops (Харьков) и 2 java (Минск и Питер). Встретились украинец, белорус и русский:)

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

Frontend Javascript Программирование Web Web-программирование Rest Резюме Текст
72
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии