digital-garden/knowledge/dev/java/frameworks/quarkus/Реализация JWT авторизации в Quarkus.md
2024-06-13 21:01:37 +03:00

70 lines
2.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
aliases:
tags:
- зрелость/🌱
- tag/quarkus
- tag/auth
- tag/jwt
date:
- - 2024-03-03
zero-link:
- "[[Quarkus]]"
parents:
linked:
---
Quarkus из коробки поддерживаеет JWT авторизацию.
Чтобы получить возможность создавать JWT необходимо добавить зависимость
```xml
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt-build</artifactId>
</dependency>
```
Чтобы получить возможность валидировать JWT необходимо добавить зависимость
```xml
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-jwt</artifactId>
</dependency>
```
Далее необходимо [сгенерировать приватный и публичный ключ](Генерация%20ключей%20с%20использованием%20openssl.md). После чего положить их в папку `src/main/resources`.
Далее необходимо отредактировать файл `application.yml`
```
quarkus:
native:
resources:
includes:
- publicKey.pem
smallrye:
jwt:
sign:
key:
location: privateKey.pem
mp:
jwt:
verify:
publickey:
location: publicKey.pem
issuer: http://localhost:8080
```
Теперь Quarkus будет самостоятельно проверять HTTP Header на наличие JWT токена и проверять его валидность.
Генерация токена происходит вручную. Необходимо написать REST-контроллер, который будет отдавать пользователям токен.
```java
Jwt.issuer("http://localhost:8080")
.up(person.getEmail())
.expiresIn(Duration.ofMinutes(15))
.groups(Collections.singleton("USER"))
.claim("id", person.getId())
.sign()
```
После этого над REST-эндпойнтами можно использовать аннотации из пакета `jakarta.annotation.security.*`: `@PermitAll`, `@RolesAllowed({"USER"})`.
## Дополнительные материалы
- [Using JWT RBAC - Quarkus](https://quarkus.io/guides/security-jwt)