Skip to content

Instantly share code, notes, and snippets.

@aakhmerov
Created September 18, 2014 10:06
Show Gist options
  • Save aakhmerov/0d4d387d3c21fd985115 to your computer and use it in GitHub Desktop.
Save aakhmerov/0d4d387d3c21fd985115 to your computer and use it in GitHub Desktop.
TokenUtils
@Component
public class TokenUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(TokenUtils.class);
private static final String UTF = "UTF-8";
@Autowired
private PasswordEncoder passwordEncoder;
public static final String MAGIC_KEY = "obfuscate";
public static final String TOKEN_HEADER = "X-Auth-Token";
public static final String REQUEST_PARAM = "token";
public static final String TOKEN_COOKIE = "etracker_token";
public String createToken(UserDetails userDetails) throws UnsupportedEncodingException {
/* Expires in one hour */
String expires = Long.valueOf(System.currentTimeMillis() + 1000L * 60 * 60).toString();
StringBuilder tokenBuilder = new StringBuilder();
tokenBuilder.append(userDetails.getUsername());
tokenBuilder.append(":");
tokenBuilder.append(expires);
tokenBuilder.append(":");
tokenBuilder.append(this.computeSignature(userDetails, expires));
return tokenBuilder.toString();
}
public String computeSignature(UserDetails userDetails, String expires) throws UnsupportedEncodingException {
StringBuilder signatureBuilder = new StringBuilder();
signatureBuilder.append(userDetails.getUsername());
signatureBuilder.append(":");
signatureBuilder.append(expires);
signatureBuilder.append(":");
signatureBuilder.append(userDetails.getPassword());
signatureBuilder.append(":");
signatureBuilder.append(TokenUtils.MAGIC_KEY);
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
LOGGER.error("cannot verify security token",e);
}
messageDigest.update(signatureBuilder.toString().getBytes(UTF));
String encryptedString = new String(Hex.encode(messageDigest.digest()));
return encryptedString;
}
public String getUserNameFromToken(String authToken) {
if (null == authToken) {
return null;
}
String[] parts = authToken.split(":");
return parts[0];
}
public boolean validateToken(String authToken, UserDetails userDetails) throws UnsupportedEncodingException {
String[] parts = authToken.split(":");
String signature = parts[2];
String expires = parts[1];
if (Long.valueOf(expires) < System.currentTimeMillis()) {
return false;
}
return signature.equals(this.computeSignature(userDetails, expires));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment