You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomee.apache.org by GitBox <gi...@apache.org> on 2020/07/15 00:16:31 UTC

[GitHub] [tomee] willesreis commented on a change in pull request #682: TOMEE-2872 Translate to Portuguese: examples/mp-rest-jwt

willesreis commented on a change in pull request #682:
URL: https://github.com/apache/tomee/pull/682#discussion_r454715120



##########
File path: examples/mp-rest-jwt/README_pt.adoc
##########
@@ -0,0 +1,318 @@
+= MicroProfile JWT
+:index-group: MicroProfile
+:jbake-type: page
+:jbake-status: published
+
+Este é um exemplo básico sobre como configurar e utilizar o MicroProfile JWT no TomEE.
+
+== Execute testes para diferentes cenários relacionados à validação JWT
+
+[source,java]
+----
+mvn clean test 
+----
+
+== Configuração no TomEE
+
+A classe `MoviesMPJWTConfigurationProvider.java` fornece ao TomEE as configurações necessárias para a validação do JWT.
+
+[source,java]
+----
+package org.superbiz.moviefun.rest;
+
+import org.apache.tomee.microprofile.jwt.config.JWTAuthContextInfo;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.Produces;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import java.util.Optional;
+
+@Dependent
+public class MoviesMPJWTConfigurationProvider {
+
+    @Produces
+    Optional<JWTAuthContextInfo> getOptionalContextInfo() throws NoSuchAlgorithmException, InvalidKeySpecException {
+        JWTAuthContextInfo contextInfo = new JWTAuthContextInfo();
+
+        // todo use MP Config to load the configuration
+        contextInfo.setIssuedBy("https://server.example.com");
+
+        final String pemEncoded = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEq" +
+                "Fyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwR" +
+                "TYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5e" +
+                "UF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9" +
+                "AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYn" +
+                "sIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9x" +
+                "nQIDAQAB";
+        byte[] encodedBytes = Base64.getDecoder().decode(pemEncoded);
+
+        final X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedBytes);
+        final KeyFactory kf = KeyFactory.getInstance("RSA");
+        final RSAPublicKey pk = (RSAPublicKey) kf.generatePublic(spec);
+
+        contextInfo.setSignerKey(pk);
+
+        return Optional.of(contextInfo);
+    }
+
+    @Produces
+    JWTAuthContextInfo getContextInfo() throws InvalidKeySpecException, NoSuchAlgorithmException {
+        return getOptionalContextInfo().get();
+    }
+}
+----
+
+== Usando o MicroProfile JWT no TomEE
+
+O recurso JAX-RS `MoviesRest.java` contém vários pontos de extremidade seguros, que são alcançados usando a anotação padrão `@ RolesAllowed`. O MicroProfile JWT é responsável por validar solicitações recebidas com o cabeçalho `Authorization' que fornece um token de acesso assinado.
+
+[source,java]
+----
+   package org.superbiz.moviefun.rest;
+   
+   import org.superbiz.moviefun.Movie;
+   import org.superbiz.moviefun.MoviesBean;
+   
+   import javax.annotation.security.RolesAllowed;
+   import javax.inject.Inject;
+   import javax.ws.rs.*;
+   import javax.ws.rs.core.MediaType;
+   import java.util.List;
+   
+   @Path("cinema")
+   @Produces(MediaType.APPLICATION_JSON)
+   @Consumes(MediaType.APPLICATION_JSON)
+   public class MoviesRest {
+   
+       @Inject
+       private MoviesBean moviesBean;
+   
+       @GET
+       @Produces(MediaType.TEXT_PLAIN)
+       public String status() {
+           return "ok";
+       }
+   
+       @GET
+       @Path("/movies")
+       @RolesAllowed({"crud", "read-only"})
+       public List<Movie> getListOfMovies() {
+           return moviesBean.getMovies();
+       }
+   
+       @GET
+       @Path("/movies/{id}")
+       @RolesAllowed({"crud", "read-only"})
+       public Movie getMovie(@PathParam("id") int id) {
+           return moviesBean.getMovie(id);
+       }
+   
+       @POST
+       @Path("/movies")
+       @RolesAllowed("crud")
+       public void addMovie(Movie newMovie) {
+           moviesBean.addMovie(newMovie);
+       }
+   
+       @DELETE
+       @Path("/movies/{id}")
+       @RolesAllowed("crud")
+       public void deleteMovie(@PathParam("id") int id) {
+           moviesBean.deleteMovie(id);
+       }
+   
+       @PUT
+       @Path("/movies")
+       @RolesAllowed("crud")
+       public void updateMovie(Movie updatedMovie) {
+           moviesBean.updateMovie(updatedMovie);
+       }
+   
+   }
+
+ @Inject
+ @ConfigProperty(name = "java.runtime.version")
+ private String javaVersion;
+ 
+----
+
+== Sobre a arquitetura de teste
+
+Os casos de teste para este projeto são construídos com o Arquillian. A configuração Arquillian pode ser encontrada em `src/test/resources/arquillian.xml`

Review comment:
       ```suggestion
   Os casos de teste para este projeto são construídos com o Arquillian. A configuração do Arquillian pode ser encontrada em `src/test/resources/arquillian.xml`
   ```

##########
File path: examples/mp-rest-jwt/README_pt.adoc
##########
@@ -0,0 +1,318 @@
+= MicroProfile JWT
+:index-group: MicroProfile
+:jbake-type: page
+:jbake-status: published
+
+Este é um exemplo básico sobre como configurar e utilizar o MicroProfile JWT no TomEE.
+
+== Execute testes para diferentes cenários relacionados à validação JWT
+
+[source,java]
+----
+mvn clean test 
+----
+
+== Configuração no TomEE
+
+A classe `MoviesMPJWTConfigurationProvider.java` fornece ao TomEE as configurações necessárias para a validação do JWT.
+
+[source,java]
+----
+package org.superbiz.moviefun.rest;
+
+import org.apache.tomee.microprofile.jwt.config.JWTAuthContextInfo;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.Produces;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import java.util.Optional;
+
+@Dependent
+public class MoviesMPJWTConfigurationProvider {
+
+    @Produces
+    Optional<JWTAuthContextInfo> getOptionalContextInfo() throws NoSuchAlgorithmException, InvalidKeySpecException {
+        JWTAuthContextInfo contextInfo = new JWTAuthContextInfo();
+
+        // todo use MP Config to load the configuration
+        contextInfo.setIssuedBy("https://server.example.com");
+
+        final String pemEncoded = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEq" +
+                "Fyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwR" +
+                "TYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5e" +
+                "UF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9" +
+                "AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYn" +
+                "sIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9x" +
+                "nQIDAQAB";
+        byte[] encodedBytes = Base64.getDecoder().decode(pemEncoded);
+
+        final X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedBytes);
+        final KeyFactory kf = KeyFactory.getInstance("RSA");
+        final RSAPublicKey pk = (RSAPublicKey) kf.generatePublic(spec);
+
+        contextInfo.setSignerKey(pk);
+
+        return Optional.of(contextInfo);
+    }
+
+    @Produces
+    JWTAuthContextInfo getContextInfo() throws InvalidKeySpecException, NoSuchAlgorithmException {
+        return getOptionalContextInfo().get();
+    }
+}
+----
+
+== Usando o MicroProfile JWT no TomEE
+
+O recurso JAX-RS `MoviesRest.java` contém vários pontos de extremidade seguros, que são alcançados usando a anotação padrão `@ RolesAllowed`. O MicroProfile JWT é responsável por validar solicitações recebidas com o cabeçalho `Authorization' que fornece um token de acesso assinado.
+
+[source,java]
+----
+   package org.superbiz.moviefun.rest;
+   
+   import org.superbiz.moviefun.Movie;
+   import org.superbiz.moviefun.MoviesBean;
+   
+   import javax.annotation.security.RolesAllowed;
+   import javax.inject.Inject;
+   import javax.ws.rs.*;
+   import javax.ws.rs.core.MediaType;
+   import java.util.List;
+   
+   @Path("cinema")
+   @Produces(MediaType.APPLICATION_JSON)
+   @Consumes(MediaType.APPLICATION_JSON)
+   public class MoviesRest {
+   
+       @Inject
+       private MoviesBean moviesBean;
+   
+       @GET
+       @Produces(MediaType.TEXT_PLAIN)
+       public String status() {
+           return "ok";
+       }
+   
+       @GET
+       @Path("/movies")
+       @RolesAllowed({"crud", "read-only"})
+       public List<Movie> getListOfMovies() {
+           return moviesBean.getMovies();
+       }
+   
+       @GET
+       @Path("/movies/{id}")
+       @RolesAllowed({"crud", "read-only"})
+       public Movie getMovie(@PathParam("id") int id) {
+           return moviesBean.getMovie(id);
+       }
+   
+       @POST
+       @Path("/movies")
+       @RolesAllowed("crud")
+       public void addMovie(Movie newMovie) {
+           moviesBean.addMovie(newMovie);
+       }
+   
+       @DELETE
+       @Path("/movies/{id}")
+       @RolesAllowed("crud")
+       public void deleteMovie(@PathParam("id") int id) {
+           moviesBean.deleteMovie(id);
+       }
+   
+       @PUT
+       @Path("/movies")
+       @RolesAllowed("crud")
+       public void updateMovie(Movie updatedMovie) {
+           moviesBean.updateMovie(updatedMovie);
+       }
+   
+   }
+
+ @Inject
+ @ConfigProperty(name = "java.runtime.version")
+ private String javaVersion;
+ 
+----
+
+== Sobre a arquitetura de teste
+
+Os casos de teste para este projeto são construídos com o Arquillian. A configuração Arquillian pode ser encontrada em `src/test/resources/arquillian.xml`
+
+A classe `TokenUtils.java` é usada durante o teste para atuar como um servidor de Autorização que gera `Access Tokens` com base nos arquivos de configuração `privateKey.pem`,` publicKey.pem`, `Token1.json` e` Token2 .json`.
+
+`nimbus-jose-jwt` é a biblioteca usada para a geração JWT durante as provas.
+
+`Token1.json`
+
+[source,java]
+----
+{
+    "iss": "https://server.example.com",
+    "jti": "a-123",
+    "sub": "24400320",
+    "upn": "jdoe@example.com",
+    "preferred_username": "jdoe",
+    "aud": "s6BhdRkqt3",
+    "exp": 1311281970,
+    "iat": 1311280970,
+    "auth_time": 1311280969,
+    "groups": [
+        "group1",
+        "group2",
+        "crud",
+        "read-only"
+    ]
+}
+----
+
+`Token2.json`
+
+[source,java]
+----
+{
+  "iss": "https://server.example.com",
+  "jti": "a-123",
+  "sub": "24400320",
+  "upn": "alice@example.com",
+  "preferred_username": "alice",
+  "aud": "s6BhdRkqt3",
+  "exp": 1311281970,
+  "iat": 1311280970,
+  "auth_time": 1311280969,
+  "groups": [
+    "read-only"
+  ]
+}
+----
+
+== Cenários de teste
+
+`MovieTest.java` Contém 4 cenários OAuth2 para diferentes combinações de JWT.

Review comment:
       ```suggestion
   `MovieTest.java` contém 4 cenários OAuth2 para diferentes combinações de JWT.
   ```

##########
File path: examples/mp-rest-jwt/README_pt.adoc
##########
@@ -0,0 +1,318 @@
+= MicroProfile JWT
+:index-group: MicroProfile
+:jbake-type: page
+:jbake-status: published
+
+Este é um exemplo básico sobre como configurar e utilizar o MicroProfile JWT no TomEE.
+
+== Execute testes para diferentes cenários relacionados à validação JWT
+
+[source,java]
+----
+mvn clean test 
+----
+
+== Configuração no TomEE
+
+A classe `MoviesMPJWTConfigurationProvider.java` fornece ao TomEE as configurações necessárias para a validação do JWT.
+
+[source,java]
+----
+package org.superbiz.moviefun.rest;
+
+import org.apache.tomee.microprofile.jwt.config.JWTAuthContextInfo;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.Produces;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import java.util.Optional;
+
+@Dependent
+public class MoviesMPJWTConfigurationProvider {
+
+    @Produces
+    Optional<JWTAuthContextInfo> getOptionalContextInfo() throws NoSuchAlgorithmException, InvalidKeySpecException {
+        JWTAuthContextInfo contextInfo = new JWTAuthContextInfo();
+
+        // todo use MP Config to load the configuration
+        contextInfo.setIssuedBy("https://server.example.com");
+
+        final String pemEncoded = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEq" +
+                "Fyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwR" +
+                "TYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5e" +
+                "UF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9" +
+                "AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYn" +
+                "sIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9x" +
+                "nQIDAQAB";
+        byte[] encodedBytes = Base64.getDecoder().decode(pemEncoded);
+
+        final X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedBytes);
+        final KeyFactory kf = KeyFactory.getInstance("RSA");
+        final RSAPublicKey pk = (RSAPublicKey) kf.generatePublic(spec);
+
+        contextInfo.setSignerKey(pk);
+
+        return Optional.of(contextInfo);
+    }
+
+    @Produces
+    JWTAuthContextInfo getContextInfo() throws InvalidKeySpecException, NoSuchAlgorithmException {
+        return getOptionalContextInfo().get();
+    }
+}
+----
+
+== Usando o MicroProfile JWT no TomEE
+
+O recurso JAX-RS `MoviesRest.java` contém vários pontos de extremidade seguros, que são alcançados usando a anotação padrão `@ RolesAllowed`. O MicroProfile JWT é responsável por validar solicitações recebidas com o cabeçalho `Authorization' que fornece um token de acesso assinado.
+
+[source,java]
+----
+   package org.superbiz.moviefun.rest;
+   
+   import org.superbiz.moviefun.Movie;
+   import org.superbiz.moviefun.MoviesBean;
+   
+   import javax.annotation.security.RolesAllowed;
+   import javax.inject.Inject;
+   import javax.ws.rs.*;
+   import javax.ws.rs.core.MediaType;
+   import java.util.List;
+   
+   @Path("cinema")
+   @Produces(MediaType.APPLICATION_JSON)
+   @Consumes(MediaType.APPLICATION_JSON)
+   public class MoviesRest {
+   
+       @Inject
+       private MoviesBean moviesBean;
+   
+       @GET
+       @Produces(MediaType.TEXT_PLAIN)
+       public String status() {
+           return "ok";
+       }
+   
+       @GET
+       @Path("/movies")
+       @RolesAllowed({"crud", "read-only"})
+       public List<Movie> getListOfMovies() {
+           return moviesBean.getMovies();
+       }
+   
+       @GET
+       @Path("/movies/{id}")
+       @RolesAllowed({"crud", "read-only"})
+       public Movie getMovie(@PathParam("id") int id) {
+           return moviesBean.getMovie(id);
+       }
+   
+       @POST
+       @Path("/movies")
+       @RolesAllowed("crud")
+       public void addMovie(Movie newMovie) {
+           moviesBean.addMovie(newMovie);
+       }
+   
+       @DELETE
+       @Path("/movies/{id}")
+       @RolesAllowed("crud")
+       public void deleteMovie(@PathParam("id") int id) {
+           moviesBean.deleteMovie(id);
+       }
+   
+       @PUT
+       @Path("/movies")
+       @RolesAllowed("crud")
+       public void updateMovie(Movie updatedMovie) {
+           moviesBean.updateMovie(updatedMovie);
+       }
+   
+   }
+
+ @Inject
+ @ConfigProperty(name = "java.runtime.version")
+ private String javaVersion;
+ 
+----
+
+== Sobre a arquitetura de teste
+
+Os casos de teste para este projeto são construídos com o Arquillian. A configuração Arquillian pode ser encontrada em `src/test/resources/arquillian.xml`
+
+A classe `TokenUtils.java` é usada durante o teste para atuar como um servidor de Autorização que gera `Access Tokens` com base nos arquivos de configuração `privateKey.pem`,` publicKey.pem`, `Token1.json` e` Token2 .json`.
+
+`nimbus-jose-jwt` é a biblioteca usada para a geração JWT durante as provas.

Review comment:
       ```suggestion
   `nimbus-jose-jwt` é a biblioteca usada para a geração do JWT durante os testes.
   ```

##########
File path: examples/mp-rest-jwt/README_pt.adoc
##########
@@ -0,0 +1,318 @@
+= MicroProfile JWT
+:index-group: MicroProfile
+:jbake-type: page
+:jbake-status: published
+
+Este é um exemplo básico sobre como configurar e utilizar o MicroProfile JWT no TomEE.
+
+== Execute testes para diferentes cenários relacionados à validação JWT
+
+[source,java]
+----
+mvn clean test 
+----
+
+== Configuração no TomEE
+
+A classe `MoviesMPJWTConfigurationProvider.java` fornece ao TomEE as configurações necessárias para a validação do JWT.
+
+[source,java]
+----
+package org.superbiz.moviefun.rest;
+
+import org.apache.tomee.microprofile.jwt.config.JWTAuthContextInfo;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.Produces;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import java.util.Optional;
+
+@Dependent
+public class MoviesMPJWTConfigurationProvider {
+
+    @Produces
+    Optional<JWTAuthContextInfo> getOptionalContextInfo() throws NoSuchAlgorithmException, InvalidKeySpecException {
+        JWTAuthContextInfo contextInfo = new JWTAuthContextInfo();
+
+        // todo use MP Config to load the configuration
+        contextInfo.setIssuedBy("https://server.example.com");
+
+        final String pemEncoded = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEq" +
+                "Fyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwR" +
+                "TYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5e" +
+                "UF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9" +
+                "AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYn" +
+                "sIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9x" +
+                "nQIDAQAB";
+        byte[] encodedBytes = Base64.getDecoder().decode(pemEncoded);
+
+        final X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedBytes);
+        final KeyFactory kf = KeyFactory.getInstance("RSA");
+        final RSAPublicKey pk = (RSAPublicKey) kf.generatePublic(spec);
+
+        contextInfo.setSignerKey(pk);
+
+        return Optional.of(contextInfo);
+    }
+
+    @Produces
+    JWTAuthContextInfo getContextInfo() throws InvalidKeySpecException, NoSuchAlgorithmException {
+        return getOptionalContextInfo().get();
+    }
+}
+----
+
+== Usando o MicroProfile JWT no TomEE
+
+O recurso JAX-RS `MoviesRest.java` contém vários pontos de extremidade seguros, que são alcançados usando a anotação padrão `@ RolesAllowed`. O MicroProfile JWT é responsável por validar solicitações recebidas com o cabeçalho `Authorization' que fornece um token de acesso assinado.

Review comment:
       ```suggestion
   O recurso JAX-RS `MoviesRest.java` contém vários endpoints que estão protegidos usando a anotação padrão `@ RolesAllowed`. O MicroProfile JWT é responsável por validar solicitações recebidas com o cabeçalho `Authorization' que fornece um token de acesso assinado.
   ```

##########
File path: examples/mp-rest-jwt/README_pt.adoc
##########
@@ -0,0 +1,318 @@
+= MicroProfile JWT
+:index-group: MicroProfile
+:jbake-type: page
+:jbake-status: published
+
+Este é um exemplo básico sobre como configurar e utilizar o MicroProfile JWT no TomEE.
+
+== Execute testes para diferentes cenários relacionados à validação JWT
+
+[source,java]
+----
+mvn clean test 
+----
+
+== Configuração no TomEE
+
+A classe `MoviesMPJWTConfigurationProvider.java` fornece ao TomEE as configurações necessárias para a validação do JWT.
+
+[source,java]
+----
+package org.superbiz.moviefun.rest;
+
+import org.apache.tomee.microprofile.jwt.config.JWTAuthContextInfo;
+
+import javax.enterprise.context.Dependent;
+import javax.enterprise.inject.Produces;
+import java.security.KeyFactory;
+import java.security.NoSuchAlgorithmException;
+import java.security.interfaces.RSAPublicKey;
+import java.security.spec.InvalidKeySpecException;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+import java.util.Optional;
+
+@Dependent
+public class MoviesMPJWTConfigurationProvider {
+
+    @Produces
+    Optional<JWTAuthContextInfo> getOptionalContextInfo() throws NoSuchAlgorithmException, InvalidKeySpecException {
+        JWTAuthContextInfo contextInfo = new JWTAuthContextInfo();
+
+        // todo use MP Config to load the configuration
+        contextInfo.setIssuedBy("https://server.example.com");
+
+        final String pemEncoded = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlivFI8qB4D0y2jy0CfEq" +
+                "Fyy46R0o7S8TKpsx5xbHKoU1VWg6QkQm+ntyIv1p4kE1sPEQO73+HY8+Bzs75XwR" +
+                "TYL1BmR1w8J5hmjVWjc6R2BTBGAYRPFRhor3kpM6ni2SPmNNhurEAHw7TaqszP5e" +
+                "UF/F9+KEBWkwVta+PZ37bwqSE4sCb1soZFrVz/UT/LF4tYpuVYt3YbqToZ3pZOZ9" +
+                "AX2o1GCG3xwOjkc4x0W7ezbQZdC9iftPxVHR8irOijJRRjcPDtA6vPKpzLl6CyYn" +
+                "sIYPd99ltwxTHjr3npfv/3Lw50bAkbT4HeLFxTx4flEoZLKO/g0bAoV2uqBhkA9x" +
+                "nQIDAQAB";
+        byte[] encodedBytes = Base64.getDecoder().decode(pemEncoded);
+
+        final X509EncodedKeySpec spec = new X509EncodedKeySpec(encodedBytes);
+        final KeyFactory kf = KeyFactory.getInstance("RSA");
+        final RSAPublicKey pk = (RSAPublicKey) kf.generatePublic(spec);
+
+        contextInfo.setSignerKey(pk);
+
+        return Optional.of(contextInfo);
+    }
+
+    @Produces
+    JWTAuthContextInfo getContextInfo() throws InvalidKeySpecException, NoSuchAlgorithmException {
+        return getOptionalContextInfo().get();
+    }
+}
+----
+
+== Usando o MicroProfile JWT no TomEE
+
+O recurso JAX-RS `MoviesRest.java` contém vários pontos de extremidade seguros, que são alcançados usando a anotação padrão `@ RolesAllowed`. O MicroProfile JWT é responsável por validar solicitações recebidas com o cabeçalho `Authorization' que fornece um token de acesso assinado.
+
+[source,java]
+----
+   package org.superbiz.moviefun.rest;
+   
+   import org.superbiz.moviefun.Movie;
+   import org.superbiz.moviefun.MoviesBean;
+   
+   import javax.annotation.security.RolesAllowed;
+   import javax.inject.Inject;
+   import javax.ws.rs.*;
+   import javax.ws.rs.core.MediaType;
+   import java.util.List;
+   
+   @Path("cinema")
+   @Produces(MediaType.APPLICATION_JSON)
+   @Consumes(MediaType.APPLICATION_JSON)
+   public class MoviesRest {
+   
+       @Inject
+       private MoviesBean moviesBean;
+   
+       @GET
+       @Produces(MediaType.TEXT_PLAIN)
+       public String status() {
+           return "ok";
+       }
+   
+       @GET
+       @Path("/movies")
+       @RolesAllowed({"crud", "read-only"})
+       public List<Movie> getListOfMovies() {
+           return moviesBean.getMovies();
+       }
+   
+       @GET
+       @Path("/movies/{id}")
+       @RolesAllowed({"crud", "read-only"})
+       public Movie getMovie(@PathParam("id") int id) {
+           return moviesBean.getMovie(id);
+       }
+   
+       @POST
+       @Path("/movies")
+       @RolesAllowed("crud")
+       public void addMovie(Movie newMovie) {
+           moviesBean.addMovie(newMovie);
+       }
+   
+       @DELETE
+       @Path("/movies/{id}")
+       @RolesAllowed("crud")
+       public void deleteMovie(@PathParam("id") int id) {
+           moviesBean.deleteMovie(id);
+       }
+   
+       @PUT
+       @Path("/movies")
+       @RolesAllowed("crud")
+       public void updateMovie(Movie updatedMovie) {
+           moviesBean.updateMovie(updatedMovie);
+       }
+   
+   }
+
+ @Inject
+ @ConfigProperty(name = "java.runtime.version")
+ private String javaVersion;
+ 
+----
+
+== Sobre a arquitetura de teste
+
+Os casos de teste para este projeto são construídos com o Arquillian. A configuração Arquillian pode ser encontrada em `src/test/resources/arquillian.xml`
+
+A classe `TokenUtils.java` é usada durante o teste para atuar como um servidor de Autorização que gera `Access Tokens` com base nos arquivos de configuração `privateKey.pem`,` publicKey.pem`, `Token1.json` e` Token2 .json`.

Review comment:
       ```suggestion
   A classe `TokenUtils.java` é usada durante o teste para atuar como um servidor de Autorização que gera `Access Tokens` com base nos arquivos de configuração `privateKey.pem`, `publicKey.pem`, `Token1.json` e `Token2 .json`.
   ```




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org