https://github.com/rinnothing/simple-jwt
https://github.com/rinnothing/simple-jwt
Last synced: 8 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/rinnothing/simple-jwt
- Owner: rinnothing
- License: mit
- Created: 2025-07-17T07:34:43.000Z (11 months ago)
- Default Branch: main
- Last Pushed: 2025-07-22T23:15:42.000Z (11 months ago)
- Last Synced: 2025-09-03T15:14:09.588Z (10 months ago)
- Language: Go
- Size: 71.3 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
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 для себя, поэтому оно не обязано работать по одной кнопке)