/*
* oxAuth is available under the MIT License (2008). See http://opensource.org/licenses/MIT for full text.
*
* Copyright (c) 2014, Gluu
*/
package org.xdi.oxauth.model.jwt;
import org.apache.commons.lang.StringUtils;
import org.xdi.oxauth.model.exception.InvalidJwtException;
import org.xdi.oxauth.model.token.JsonWebResponse;
/**
* JSON Web Token (JWT) is a compact token format intended for space constrained
* environments such as HTTP Authorization headers and URI query parameters.
* JWTs encode claims to be transmitted as a JSON object (as defined in RFC 4627)
* that is base64url encoded and digitally signed. Signing is accomplished using
* a JSON Web Signature (JWS). JWTs may also be optionally encrypted using JSON
* Web Encryption (JWE).
*
* @author Javier Rojas Blum
* @version May 3, 2017
*/
public class Jwt extends JsonWebResponse {
private String encodedHeader;
private String encodedClaims;
private String encodedSignature;
private boolean loaded = false;
public Jwt() {
encodedHeader = null;
encodedClaims = null;
encodedSignature = null;
}
public String getEncodedSignature() {
return encodedSignature;
}
public void setEncodedSignature(String encodedSignature) {
this.encodedSignature = encodedSignature;
}
public String getSigningInput() throws InvalidJwtException {
if (loaded) {
return encodedHeader + "." + encodedClaims;
} else {
return header.toBase64JsonObject() + "." + claims.toBase64JsonObject();
}
}
public static Jwt parse(String encodedJwt) throws InvalidJwtException {
if (StringUtils.isBlank(encodedJwt)) {
return null;
}
String encodedHeader = null;
String encodedClaims = null;
String encodedSignature = null;
String[] jwtParts = encodedJwt.split("\\.");
if (jwtParts.length == 2) { // Signature Algorithm NONE
encodedHeader = jwtParts[0];
encodedClaims = jwtParts[1];
encodedSignature = "";
} else if (jwtParts.length == 3) {
encodedHeader = jwtParts[0];
encodedClaims = jwtParts[1];
encodedSignature = jwtParts[2];
} else {
throw new InvalidJwtException("Invalid JWT format.");
}
Jwt jwt = new Jwt();
jwt.setHeader(new JwtHeader(encodedHeader));
jwt.setClaims(new JwtClaims(encodedClaims));
jwt.setEncodedSignature(encodedSignature);
jwt.encodedHeader = encodedHeader;
jwt.encodedClaims = encodedClaims;
jwt.loaded = true;
return jwt;
}
@Override
public String toString() {
try {
if (encodedSignature == null) {
return getSigningInput() + ".";
} else {
return getSigningInput() + "." + encodedSignature;
}
} catch (InvalidJwtException e) {
e.printStackTrace();
}
return "";
}
}