blob: 417a8430ef62f9147150f42b8de0dbafe134a893 [file] [log] [blame]
= MicroProfile JWT Principal
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published
Este é um exemplo de como usar o MicroProfile JWT no TomEE, acessando o `Principal` no JsonWebToken.
== Executando a aplicação:
[source, bash]
----
mvn clean install tomee:run
----
Este exemplo é uma aplicação CRUD para pedidos na loja.
== Requisitos e configuração
Para o uso do MicroProfile JWT, precisamos alterar o seguinte em nosso projeto:
[arabic]
. Adicione a dependência ao nosso arquivo `pom.xml`:
+
[source,xml]
----
<dependency>
<groupId>org.eclipse.microprofile.jwt</groupId>
<artifactId>microprofile-jwt-auth-api</artifactId>
<version>${mp-jwt.version}</version>
<scope>provided</scope>
</dependency>
----
. Anote nossa `Application.class` com `@LoginConfig(authMethod = "MP-JWT")`
. Forneça `public` and `private key` para autenticação. E especifique a localização da `public key` e do `issuer` no nosso arquivo `microprofile-config.properties`.
+
[source,properties]
----
mp.jwt.verify.publickey.location=/publicKey.pem
mp.jwt.verify.issuer=https://example.com
----
. Defina `@RolesAllowed()` nos endpoints que queremos proteger.
== Obtenção do JWT Principal
Obtemos o `Principal` na classe MicroProfile `org.eclipse.microprofile.jwt.JsonWebToken`. De lá
podemos adquirir o nome de usuário e os grupos do usuário que está acessando o endpoint.
[source,java]
----
@Inject
private JsonWebToken jwtPrincipal;
----
== Sobre a arquitetura da aplicação
A aplicação nos permite manipular pedidos com usuários específicos. Temos dois usuários: `Alice Wonder` e `John Doe`. Eles podem ler, criar, editar e excluir entradas específicas. E para cada criação, salvamos o usuário que criou o pedido. Caso um usuário edite a entrada, registramos que, acessando o `Principal` que enviou a solicitação ao nosso back-end.
`alice-wonder-jwt.json`
[source,json]
----
{
"iss": "https://example.com",
"upn": "alice",
"sub": "alice.wonder@example.com",
"name": "Alice Wonder",
"iat": 1516239022,
"groups": [
"buyer"
]
}
----
`john-doe-jwt.json`
[source,json]
----
{
"iss": "https://example.com",
"upn": "john",
"sub": "john.doe@example.com",
"name": "John Doe",
"iat": 1516239022,
"groups": [
"merchant"
]
}
----
== Acesse os endpoints com JWT token
Acessamos os endpoints da nossa classe de teste criando um `JWT` com a ajuda do nosso `TokenUtils.generateJWTString(String jsonResource)`, que assina nossos dados do usuário no formato json com a ajuda do nossa chave `src/test/resources/privateKey.pem.`
Também podemos gerar o novo `privateKey.pem` e `publicKey.pem` com o método `GenerateKeyUtils.generateKeyPair(String keyAlgorithm, int keySize)`.