×

Welcome to TagMyCode

Please login or create account to add a snippet.
0
0
 
1
Language: Text
Posted by: Mohammad Amir
Added: Jan 3, 2017 11:01 AM
Modified: Jan 3, 2017 11:04 AM
Views: 17
Tags: java
  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6. package com.amu.osp.service;
  7.  
  8. /**
  9.  *
  10.  * @author HP
  11.  */
  12. import java.io.IOException;
  13. import java.util.ArrayList;
  14. import java.util.LinkedList;
  15. import java.util.List;
  16.  
  17. import javax.ws.rs.GET;
  18. import javax.ws.rs.HeaderParam;
  19. import javax.ws.rs.Path;
  20. import javax.ws.rs.Produces;
  21. import javax.ws.rs.QueryParam;
  22. import javax.ws.rs.core.MediaType;
  23. import javax.ws.rs.core.Response;
  24.  
  25. import org.apache.log4j.Logger;
  26. import org.bson.Document;
  27. import org.codehaus.jackson.JsonGenerationException;
  28. import org.codehaus.jackson.JsonParseException;
  29. import org.codehaus.jackson.map.JsonMappingException;
  30. import org.codehaus.jackson.map.ObjectMapper;
  31. import org.jose4j.jwk.JsonWebKey;
  32. import org.jose4j.jwk.JsonWebKeySet;
  33. import org.jose4j.jwk.RsaJsonWebKey;
  34. import org.jose4j.jwk.RsaJwkGenerator;
  35. import org.jose4j.jws.AlgorithmIdentifiers;
  36. import org.jose4j.jws.JsonWebSignature;
  37. import org.jose4j.jwt.JwtClaims;
  38. import org.jose4j.jwt.consumer.InvalidJwtException;
  39. import org.jose4j.jwt.consumer.JwtConsumer;
  40. import org.jose4j.jwt.consumer.JwtConsumerBuilder;
  41. import org.jose4j.lang.JoseException;
  42.  
  43. import com.amu.osp.model.Item;
  44. import com.amu.osp.model.StatusMessage;
  45. import com.amu.osp.model.User;
  46. import com.amu.osp.uitl.MongoDBSingleton;
  47. import com.mongodb.BasicDBObject;
  48. import com.mongodb.client.MongoDatabase;
  49. import javax.ws.rs.core.Response.Status;
  50.  
  51. @Path("/security")
  52. public class JwtSecurityExample {
  53.  
  54.     static Logger logger = Logger.getLogger(JwtSecurityExample.class);
  55.     static List<JsonWebKey> jwkList = null;
  56.    
  57.     static {        
  58.         logger.info("Inside static initializer...");
  59.         jwkList = new LinkedList<>();        
  60.         for (int kid = 1; kid <= 3; kid++) {            
  61.             JsonWebKey jwk = null;
  62.             try {
  63.                 jwk = RsaJwkGenerator.generateJwk(2048);                
  64.                 logger.info("PUBLIC KEY (" + kid + "): "
  65.                         + jwk.toJson(JsonWebKey.OutputControlLevel.PUBLIC_ONLY));
  66.             } catch (JoseException e) {
  67.                 e.printStackTrace();
  68.             }            
  69.             jwk.setKeyId(String.valueOf(kid));            
  70.             jwkList.add(jwk);            
  71.         }        
  72.     }
  73.    
  74.     @Path("/status")
  75.     @GET
  76.     @Produces(MediaType.TEXT_HTML)
  77.     public String returnVersion() {
  78.         return "JwtSecurityExample Status is OK...";
  79.     }
  80.    
  81.     @Path("/authenticate")
  82.     @GET
  83.     @Produces(MediaType.APPLICATION_JSON)
  84.     public Response authenticateCredentials(@HeaderParam("username") String username,
  85.             @HeaderParam("password") String password)
  86.             throws JsonGenerationException, JsonMappingException,
  87.             IOException {
  88.        
  89.         logger.info("Authenticating User Credentials...");
  90.         System.out.print("Authenticating.....");
  91.         if (username == null) {
  92.             StatusMessage statusMessage = new StatusMessage();
  93.             statusMessage.setStatus(
  94.                     Status.PRECONDITION_FAILED.getStatusCode());
  95.             statusMessage.setMessage("Username value is missing!!!");
  96.             return Response.status(
  97.                     Status.PRECONDITION_FAILED.getStatusCode())
  98.                     .entity(statusMessage).build();
  99.         }
  100.        
  101.         if (password == null) {
  102.             StatusMessage statusMessage = new StatusMessage();
  103.             statusMessage.setStatus(
  104.                     Status.PRECONDITION_FAILED.getStatusCode());
  105.             statusMessage.setMessage("Password value is missing!!!");
  106.             return Response.status(
  107.                     Status.PRECONDITION_FAILED.getStatusCode())
  108.                     .entity(statusMessage).build();
  109.         }
  110.        
  111.         User user = validUser(username, password);        
  112.         if (user == null) {
  113.             StatusMessage statusMessage = new StatusMessage();
  114.             statusMessage.setStatus(Status.FORBIDDEN.getStatusCode());
  115.             statusMessage.setMessage(
  116.                     "Access Denied for this functionality !!!");
  117.             return Response.status(Status.FORBIDDEN.getStatusCode())
  118.                     .entity(statusMessage).build();
  119.         }
  120.        
  121.         RsaJsonWebKey senderJwk = (RsaJsonWebKey) jwkList.get(0);
  122.        
  123.         senderJwk.setKeyId("1");
  124.         logger.info("JWK (1) ===> " + senderJwk.toJson());
  125.  
  126.         // Create the Claims, which will be the content of the JWT
  127.         JwtClaims claims = new JwtClaims();
  128.         claims.setIssuer("amu.com");
  129.         claims.setExpirationTimeMinutesInTheFuture(10);
  130.         claims.setGeneratedJwtId();
  131.         claims.setIssuedAtToNow();
  132.         claims.setNotBeforeMinutesInThePast(2);
  133.         claims.setSubject(user.getUsername());
  134.         claims.setStringListClaim("roles", user.getRolesList());        
  135.        
  136.         JsonWebSignature jws = new JsonWebSignature();
  137.        
  138.         jws.setPayload(claims.toJson());
  139.        
  140.         jws.setKeyIdHeaderValue(senderJwk.getKeyId());
  141.         jws.setKey(senderJwk.getPrivateKey());
  142.        
  143.         jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);        
  144.        
  145.         String jwt = null;
  146.         try {
  147.             jwt = jws.getCompactSerialization();
  148.         } catch (JoseException e) {
  149.             e.printStackTrace();
  150.         }
  151.        
  152.         return Response.status(200).entity(jwt).build();
  153.     }
  154.  
  155.     // --- Protected resource using JWT Tokens` ---
  156.     @Path("/finditembyid")
  157.     @GET
  158.     @Produces(MediaType.APPLICATION_JSON)
  159.     public Response findItemById(@HeaderParam("token") String token,
  160.             @QueryParam("itemid") String item_id)
  161.             throws JsonGenerationException,
  162.             JsonMappingException, IOException {
  163.        
  164.         Item item = null;
  165.        
  166.         logger.info("Inside findOrderById...");
  167.        
  168.         if (token == null) {
  169.             StatusMessage statusMessage = new StatusMessage();
  170.             statusMessage.setStatus(Status.FORBIDDEN.getStatusCode());
  171.             statusMessage.setMessage(
  172.                     "Access Denied for this functionality !!!");
  173.             return Response.status(Status.FORBIDDEN.getStatusCode())
  174.                     .entity(statusMessage).build();
  175.         }
  176.        
  177.         JsonWebKeySet jwks = new JsonWebKeySet(jwkList);        
  178.         JsonWebKey jwk = jwks.findJsonWebKey("1", null, null, null);
  179.         logger.info("JWK (1) ===> " + jwk.toJson());
  180.  
  181.         // Validate Token's authenticity and check claims
  182.         JwtConsumer jwtConsumer = new JwtConsumerBuilder()
  183.                 .setRequireExpirationTime()
  184.                 .setAllowedClockSkewInSeconds(30)
  185.                 .setRequireSubject()
  186.                 .setExpectedIssuer("amu.com")
  187.                 .setVerificationKey(jwk.getKey())
  188.                 .build();
  189.        
  190.         try {
  191.             //  Validate the JWT and process it to the Claims
  192.             JwtClaims jwtClaims = jwtConsumer.processToClaims(token);
  193.             logger.info("JWT validation succeeded! " + jwtClaims);
  194.         } catch (InvalidJwtException e) {
  195.             logger.error("JWT is Invalid: " + e);
  196.             StatusMessage statusMessage = new StatusMessage();
  197.             statusMessage.setStatus(Status.FORBIDDEN.getStatusCode());
  198.             statusMessage.setMessage(
  199.                     "Access Denied for this functionality !!!");
  200.             return Response.status(Status.FORBIDDEN.getStatusCode())
  201.                     .entity(statusMessage).build();
  202.         }
  203.        
  204.         MongoDBSingleton mongoDB = MongoDBSingleton.getInstance();
  205.         MongoDatabase db = mongoDB.getDatabase();
  206.        
  207.         BasicDBObject query = new BasicDBObject();
  208.         query.put("_id", item_id);
  209.         List<Document> results = db.getCollection("items").find(query)
  210.                 .into(new ArrayList<Document>());
  211.         int size = results.size();
  212.        
  213.         if (size == 0) {
  214.             StatusMessage statusMessage = new StatusMessage();
  215.             statusMessage.setStatus(
  216.                     Status.PRECONDITION_FAILED.getStatusCode());
  217.             statusMessage.setMessage("Unable to find that item !!!");
  218.             return Response.status(
  219.                     Status.PRECONDITION_FAILED.getStatusCode())
  220.                     .entity(statusMessage).build();
  221.         }
  222.        
  223.         for (Document current : results) {
  224.             ObjectMapper mapper = new ObjectMapper();
  225.             try {
  226.                 logger.info(current.toJson());
  227.                 item = mapper.readValue(current.toJson(), Item.class);
  228.             } catch (JsonParseException e) {
  229.                 e.printStackTrace();
  230.             } catch (JsonMappingException e) {
  231.                 e.printStackTrace();
  232.             } catch (IOException e) {
  233.                 e.printStackTrace();
  234.             }
  235.         }
  236.        
  237.         return Response.status(200).entity(item).build();
  238.     }
  239.  
  240.     // --- Protected resource using JWT Token ---
  241.     @Path("/showallitems")
  242.     @GET
  243.     @Produces(MediaType.APPLICATION_JSON)
  244.     public Response showAllItems(@HeaderParam("token") String token)
  245.             throws JsonGenerationException,
  246.             JsonMappingException, IOException {
  247.        
  248.         Item item = null;
  249.        
  250.         logger.info("Inside showAllItems...");
  251.        
  252.         if (token == null) {
  253.             StatusMessage statusMessage = new StatusMessage();
  254.             statusMessage.setStatus(Status.FORBIDDEN.getStatusCode());
  255.             statusMessage.setMessage(
  256.                     "Access Denied for this functionality !!!");
  257.             return Response.status(Status.FORBIDDEN.getStatusCode())
  258.                     .entity(statusMessage).build();
  259.         }
  260.        
  261.         JsonWebKeySet jwks = new JsonWebKeySet(jwkList);        
  262.         JsonWebKey jwk = jwks.findJsonWebKey("1", null, null, null);
  263.         logger.info("JWK (1) ===> " + jwk.toJson());
  264.  
  265.         // Validate Token's authenticity and check claims
  266.         JwtConsumer jwtConsumer = new JwtConsumerBuilder()
  267.                 .setRequireExpirationTime()
  268.                 .setAllowedClockSkewInSeconds(30)
  269.                 .setRequireSubject()
  270.                 .setExpectedIssuer("avaldes.com")
  271.                 .setVerificationKey(jwk.getKey())
  272.                 .build();
  273.        
  274.         try {
  275.             //  Validate the JWT and process it to the Claims
  276.             JwtClaims jwtClaims = jwtConsumer.processToClaims(token);
  277.             logger.info("JWT validation succeeded! " + jwtClaims);
  278.         } catch (InvalidJwtException e) {
  279.             logger.error("JWT is Invalid: " + e);
  280.             StatusMessage statusMessage = new StatusMessage();
  281.             statusMessage.setStatus(Status.FORBIDDEN.getStatusCode());
  282.             statusMessage.setMessage(
  283.                     "Access Denied for this functionality !!!");
  284.             return Response.status(
  285.                     Status.FORBIDDEN.getStatusCode())
  286.                     .entity(statusMessage).build();
  287.         }
  288.        
  289.         MongoDBSingleton mongoDB = MongoDBSingleton.getInstance();
  290.         MongoDatabase db = mongoDB.getDatabase();
  291.        
  292.         List<Document> results = db.getCollection("items").find()
  293.                 .into(new ArrayList<Document>());
  294.         int size = results.size();
  295.        
  296.         if (size == 0) {
  297.             StatusMessage statusMessage = new StatusMessage();
  298.             statusMessage.setStatus(
  299.                     Status.PRECONDITION_FAILED.getStatusCode());
  300.             statusMessage.setMessage("There are no Items to display !!!");
  301.             return Response.status(
  302.                     Status.PRECONDITION_FAILED.getStatusCode())
  303.                     .entity(statusMessage).build();
  304.         }
  305.        
  306.         List<Item> allItems = new ArrayList<Item>();
  307.         for (Document current : results) {
  308.             ObjectMapper mapper = new ObjectMapper();
  309.             try {
  310.                 logger.info(current.toJson());
  311.                 item = mapper.readValue(current.toJson(), Item.class);
  312.                 allItems.add(item);
  313.             } catch (JsonParseException e) {
  314.                 e.printStackTrace();
  315.             } catch (JsonMappingException e) {
  316.                 e.printStackTrace();
  317.             } catch (IOException e) {
  318.                 e.printStackTrace();
  319.             }
  320.         }
  321.        
  322.         return Response.status(200).entity(allItems).build();
  323.     }
  324.    
  325.     private User validUser(String username, String password) {
  326.         MongoDBSingleton mongoDB = MongoDBSingleton.getInstance();
  327.         MongoDatabase db = mongoDB.getDatabase();
  328.         List<Document> results = null;
  329.        
  330.         results = db.getCollection("users")
  331.                 .find(new Document("username", username))
  332.                 .limit(1).into(new ArrayList<Document>());
  333.         int size = results.size();
  334.        
  335.         if (size == 1) {
  336.             for (Document current : results) {
  337.                 ObjectMapper mapper = new ObjectMapper();
  338.                 User user = null;
  339.                 try {
  340.                     // logger.info(current.toJson());
  341.                     user = mapper.readValue(current.toJson(), User.class);
  342.                 } catch (JsonParseException e) {
  343.                     e.printStackTrace();
  344.                 } catch (JsonMappingException e) {
  345.                     e.printStackTrace();
  346.                 } catch (IOException e) {
  347.                     e.printStackTrace();
  348.                 }
  349.                 if (user != null && username.equals(user.getUsername())
  350.                         && password.equals(user.getPassword())) {
  351.                     return user;
  352.                 } else {
  353.                     return null;
  354.                 }
  355.             }
  356.             return null;
  357.         } else {
  358.             return null;
  359.         }
  360.     }
  361. }
  362.