Subversion Repositories SmartDukaan

Rev

Rev 23780 | Rev 23801 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
21543 ashik.ali 1
package com.spice.profitmandi.common.util;
2
 
3
import java.io.UnsupportedEncodingException;
4
import java.time.Instant;
5
import java.util.Arrays;
6
import java.util.Date;
23780 ashik.ali 7
import java.util.HashSet;
21543 ashik.ali 8
import java.util.List;
9
import java.util.Map;
10
 
23568 govind 11
import org.apache.logging.log4j.Logger;
12
import org.apache.logging.log4j.LogManager;
21543 ashik.ali 13
 
14
import com.auth0.jwt.JWT;
15
import com.auth0.jwt.JWTCreator.Builder;
16
import com.auth0.jwt.JWTVerifier;
17
import com.auth0.jwt.algorithms.Algorithm;
18
import com.auth0.jwt.exceptions.InvalidClaimException;
19
import com.auth0.jwt.exceptions.JWTCreationException;
20
import com.auth0.jwt.exceptions.JWTDecodeException;
21
import com.auth0.jwt.interfaces.Claim;
22
import com.auth0.jwt.interfaces.DecodedJWT;
23
import com.spice.profitmandi.common.ResponseCodeHolder;
24
import com.spice.profitmandi.common.exception.ProfitMandiBusinessException;
25
import com.spice.profitmandi.common.model.ProfitMandiConstants;
26
import com.spice.profitmandi.common.model.UserInfo;
27
 
28
public class JWTUtil {
29
	private static final String SECRET_KEY = "secrate";
30
	private static final String USER_ID = "userId";
31
	private static final String EMAIL = "email";
32
	private static final String PROFIT_MANDI = "profitmandi";
33
	//60 days
34
	private static final int EXPIRE_TIME_IN_SECONDS = ((60 * 60)*24)*60;
35
	private static Algorithm ALGORITHM;
23568 govind 36
	private static final Logger LOGGER = LogManager.getLogger(JWTUtil.class);
21543 ashik.ali 37
 
38
	static{
39
		try {
40
			ALGORITHM = Algorithm.HMAC256(SECRET_KEY);
41
		} catch (IllegalArgumentException e) {
42
			// TODO Auto-generated catch block
43
			e.printStackTrace();
44
		} catch (UnsupportedEncodingException e) {
45
			// TODO Auto-generated catch block
46
			e.printStackTrace();
47
		}
48
	}
49
 
23780 ashik.ali 50
	public static String create(int userId, String[] roleIds){
21543 ashik.ali 51
		try{
52
			return createBuilder()
53
				.withClaim(USER_ID, userId)
23780 ashik.ali 54
				.withArrayClaim(ProfitMandiConstants.ROLE_IDS, roleIds)
21543 ashik.ali 55
				.sign(ALGORITHM);
56
		}catch(JWTCreationException jwtCreationException){
57
			throw new RuntimeException(ResponseCodeHolder.getMessage("USR_1011"));
58
		}
59
	}
60
	public static String create(String email){
61
		try{
62
			return createBuilder().withClaim(EMAIL, email).sign(ALGORITHM);
63
		}catch(JWTCreationException jwtCreationException){
64
			throw new RuntimeException(ResponseCodeHolder.getMessage("USR_1011"));
65
		}
66
	}
67
 
68
	private static Builder createBuilder(){
69
		Instant createTimestamp = Instant.now();
70
		Instant expireTimestamp = Instant.now().plusSeconds(EXPIRE_TIME_IN_SECONDS);
71
		//LOGGER.info("Creating token with issuer {}, issuedAt {}, expireAt {}", PROFIT_MANDI, createTimestamp.toString(), expireTimestamp.toString());
72
		return JWT.create()
73
		.withIssuer(PROFIT_MANDI)
74
		.withIssuedAt(Date.from(createTimestamp))
75
		.withExpiresAt(Date.from(expireTimestamp));
76
	}
77
 
78
	public static boolean isExpired(String token)
79
		throws ProfitMandiBusinessException{
80
		DecodedJWT decodedJWT = parse(token);
23800 amit.gupta 81
		Map<String, Claim> claims = decodedJWT.getClaims();
82
		if(claims.containsKey(USER_ID)){
83
			final Claim roleIdsClaim = claims.get(ProfitMandiConstants.ROLE_IDS);
84
			if(roleIdsClaim.isNull()) {
85
				return true;
86
			}
87
		}
21543 ashik.ali 88
		Instant expireTime = decodedJWT.getExpiresAt().toInstant();
89
		Instant currentTime = Instant.now();
90
		//LOGGER.info("Checking token Expire time of token {} with currentTime {}, expireTime {}", token, currentTime, expireTime);
91
		if(currentTime.toEpochMilli() > expireTime.toEpochMilli()){
92
			return true;
93
		}else{
94
			return false;
95
		}
96
	}
97
 
98
	public static UserInfo getUserInfo(String token)
99
		throws ProfitMandiBusinessException{
100
		DecodedJWT decodedJWT = parse(token);
23428 amit.gupta 101
		/*Instant expireTime = decodedJWT.getExpiresAt().toInstant();
21543 ashik.ali 102
		Instant currentTime = Instant.now();
103
		if(currentTime.toEpochMilli() > expireTime.toEpochMilli()) {
104
			throw new ProfitMandiBusinessException(ProfitMandiConstants.TOKEN, token, "USR_1012");
23428 amit.gupta 105
		}*/
21543 ashik.ali 106
		Map<String, Claim> claims = decodedJWT.getClaims();
107
		if(claims.containsKey(USER_ID)){
108
			final Claim userIdclaim = claims.get(USER_ID);
109
			int userId = userIdclaim.asInt();
23780 ashik.ali 110
			final Claim roleIdsClaim = claims.get(ProfitMandiConstants.ROLE_IDS);
111
			final UserInfo userInfo = new UserInfo(userId, new HashSet<>(Arrays.asList(roleIdsClaim.asArray(Integer.class))), null);
21543 ashik.ali 112
			return userInfo;
113
		}else if(claims.containsKey(EMAIL)){
114
			final Claim emailClaim = claims.get("email");
115
			final UserInfo userInfo = new UserInfo(-1, null, emailClaim.asString());
116
			return userInfo;
117
		} else {
118
			throw new ProfitMandiBusinessException(ProfitMandiConstants.TOKEN, token, "USR_1008");
119
		}
120
	}
121
 
122
	public static List<String> getRoleNames(String token)
123
			throws ProfitMandiBusinessException{
124
			DecodedJWT decodedJWT = parse(token);
125
			Map<String, Claim> claims = decodedJWT.getClaims();
23780 ashik.ali 126
			if(claims.containsKey(ProfitMandiConstants.ROLE_IDS)){
127
				Claim claim = claims.get(ProfitMandiConstants.ROLE_IDS);
21543 ashik.ali 128
				return Arrays.asList(claim.asArray(String.class));
129
			}else{
130
				throw new ProfitMandiBusinessException(ProfitMandiConstants.TOKEN, token, "USR_1009");
131
			}
132
		}
133
 
134
	private static DecodedJWT parse(String token)
135
		throws ProfitMandiBusinessException{
136
		try{
137
			JWTVerifier verifier = JWT.require(ALGORITHM)
23429 amit.gupta 138
	            .withIssuer(PROFIT_MANDI).acceptExpiresAt(100000000)
21543 ashik.ali 139
	            .build(); //Reusable verifier instance
140
	        return verifier.verify(token);
141
		} catch (JWTDecodeException exception){
142
			throw new ProfitMandiBusinessException(ProfitMandiConstants.TOKEN, token, "USR_1010");
143
		} catch(InvalidClaimException invalidClaimException){
144
			throw new ProfitMandiBusinessException(ProfitMandiConstants.TOKEN, token, "USR_1012");
145
		}
146
	}
23428 amit.gupta 147
 
148
	public static void main(String[] args) throws Throwable{
149
		String token = JWTUtil.create("amit.gupta@shop2020.in");
150
		//System.out.println(token);
151
		//System.out.println(JWTUtil.isExpired(token));
152
		//System.out.println(JWTUtil.getUserInfo(token));
153
		DecodedJWT decodeJwt = JWTUtil.parse("eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwcm9maXRtYW5kaSIsImV4cCI6MTUxNDk3MDY4OSwiaWF0IjoxNTA5Nzg2Njg5LCJ1c2VySWQiOjMzMjM1LCJyb2xlTmFtZXMiOlsiVVNFUiJdfQ.C1lE6XvGpvQaCISG4IlJKwzEYWa3dWMLn1jXKB7fFvc");
154
		System.out.println(decodeJwt.getExpiresAt());
155
	}
21543 ashik.ali 156
}