An open API service indexing awesome lists of open source software.

https://github.com/rinnothing/simple-jwt


https://github.com/rinnothing/simple-jwt

Last synced: 8 months ago
JSON representation

Awesome Lists containing this project

README

          

# simple-jwt

## Условия

В этом проекте я создал сервис jwt-аутентификации по этому тз:

### **Задание**

Необходимо реализовать часть сервиса аутентификации. Сервис должен предоставлять четыре конечные точки API:

- на получение пары токенов (access и refresh) для пользователя с идентификатором (GUID) указанным в параметре запроса;
- на обновление пары токенов;
- на получение GUID текущего пользователя (роут должен быть защищен);
- на деавторизацию пользователя (поле выполнения этого запроса с `access` токеном, пользователю больше не должен быть доступен роут на получение его GUID и операция обновления токенов).

### **Требования**

**Требования к** `access` токену:

1. Формат токена - JWT,
2. Алгоритм для подписи токена - SHA512,
3. Хранить токен в базе строго запрещено.

**Требования к** `refresh` токену

1. Формат токена - произвольный.
2. Передаваться токен должен только в формате `base64`.
3. Хранить токен в базе строго в виде `bcrypt` хеша.
4. Токен должен быть защищен от повторного использования.
5. Токен должен быть защищен от изменений на стороне клиента.

**Требования к операции** `refresh`

1. Операцию `refresh` можно выполнить только той парой токенов, которая была выдана вместе.
2. Необходимо запретить операцию обновления токенов при изменении `User-Agent`. При этом, после неудачной попытки выполнения операции, неоходимо деавторизовать пользователя, который попытался выполнить обновление токенов.
3. При попытке обновления токенов с нового IP необходимо отправить POST-запрос на заданный `webhook` с информацией о попытке входа со стороннего IP. Запрещать операцию в данном случае не нужно.

## Реализация и комментарии
Увидеть ручки и их краткое описание можно в api/openapi.yaml
Я реализовал jwt по описанию с википедии, а вот для refresh я придумал кое-что своё, чтобы обеспечить работу пары токенов только вместе я убрал из refresh header, а payload заменил на sha512 кеш access, чтобы защитить ключ от изменения я добавил к нему подпись, а потом перевёл в base64 (не в base64url, т.к. в условии говорилось именно про base64)
Также в условии ничего не говорилось про хранение ключей, но я посчитал, что если уж мы храним данные в бд, то нам будет полезно сохранять не только сессии, но и ключи, чтобы продолжать с ними работать
Для демонстрации работы у меня написан интеграционный тест (без проверки вебхуков и проверки user-agent), но для его работы нужно откомментировать несколько строчек в docker-compose.yml и поменять хост в конфиге с db на localhost
(я написал его, как и половину Makefile для себя, поэтому оно не обязано работать по одной кнопке)