blob: 0d77df6ee575a3f2c5ebd7b14b9a9960249b31c1 [file] [log] [blame]
= MicroProfile JWT Principal
:index-group: MicroProfile
:jbake-type: page
:jbake-status: published
This is an example on how to use MicroProfile JWT in TomEE by accessing
Principal from the JsonWebToken.
== Run the application:
[source, bash]
----
mvn clean install tomee:run
----
This example is a CRUD application for orders in store.
== Requirments and configuration
For usage of MicroProfile JWT we have to change the following to our
project:
[arabic]
. Add the dependency to our `pom.xml` file:
+
[source,xml]
----
<dependency>
<groupId>org.eclipse.microprofile.jwt</groupId>
<artifactId>microprofile-jwt-auth-api</artifactId>
<version>${mp-jwt.version}</version>
<scope>provided</scope>
</dependency>
----
. Annotate our `Application.class` with `@LoginConfig(authMethod = "MP-JWT")`
. Provide public and private key for authentication. And specify the location of the public key and the issuer in our
`microprofile-config.properties` file.
+
[source,properties]
----
mp.jwt.verify.publickey.location=/publicKey.pem
mp.jwt.verify.issuer=https://example.com
----
. Define `@RolesAllowed()` on the endpoints we want to protect.
== Obtaining the JWT Principal
We obtain the `Principal` in the MicroProfile class `org.eclipse.microprofile.jwt.JsonWebToken`. From there
we can acquire username and groups of the user that is accessing the endpoint.
[source,java]
----
@Inject
private JsonWebToken jwtPrincipal;
----
== About the application architecture
The application enables us to manipulate orders with specific users. We have two users `Alice Wonder`
and `John Doe`. They can read, create, edit and delete specific entries. And for each creation
we save the user who created the order. In case a user edits the entry we record that by accessing
the `Principal` who has sent the request to our backend.
`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"
]
}
----
== Access the endpoints with JWT token
We access endpoints from our test class by creating a `JWT` with the help of
our `TokenUtils.generateJWTString(String jsonResource)` which signs our user
data in json format with the help of our `src/test/resources/privateKey.pem` key.
We can also generate new `privateKey.pem` and `publicKey.pem` with the
`GenerateKeyUtils.generateKeyPair(String keyAlgorithm, int keySize)` method.