Salesforce JWT sample code interface with realme
public class JWTConst {
// This cant be changed for RealmeAML
// Header Information
public static final string algval = 'RS256';
public static final string typval = 'JWT';
public static final string algKey = 'alg';
public static final string typkey = 'typ';
//Payload information
public static final string jtiKey= 'jti';
public static final string isskey = 'iss';
public static final string audKey = 'aud';
public static final string iatkey = 'iat';
public static final string nbfkey= 'nbf';
public static final string expKey = 'exp';
public static final string emailKey = 'email';
public static final string smskey = 'sms';
public static final string typekey = 'type';
public static final string typeEmailval = 'email';
public static final string typesmlval = 'SMS';
public static final string issVal = 'http://agency.govt.nz/service';
public static final string audVal = 'https://www.ite.logon.realme.govt.nz/saml2';
public static final long Validity = 3600;
//signature
public static final string SignatureHash = 'rsa-sha256';
//API end points
public static final string ReserveEndPoint = 'https://ws.ite.realme.govt.nz/reserveflt/v2/reserve';
public static final string UpdateEndpoint = 'https://ws.ite.realme.govt.nz/reserveflt/v1/update';
//API Verbs
Public static final string POST= 'POST';
}
public class JWTBuilder implements IJWTBuilder
{
private User GlobalUser;
private string JWTCert;
public JWTBuilder(user us, string Certificate )
{
GlobalUser = us;
JWTCert = Certificate;
}
private String base64URLencode(Blob input){
String output = encodingUtil.base64Encode(input);
output = output.replace('+', '-');
output = output.replace('/', '_');
while ( output.endsWith('=')){
output = output.subString(0,output.length()-1);
}
return output;
}
public virtual string BuildJWT()
{
try
{
JSONGenerator Header = GenerateJsonHeader();
String encodedHeader = base64URLencode(Blob.valueOf(header.getAsString()));
JSONGenerator Payload =GenerateJsonPayload();
string jwtVal = encodedHeader + '.' + base64URLencode(Blob.valueOf(Payload.getAsString()));
Blob signature = Crypto.signWithCertificate(JWTConst.SignatureHash, Blob.valueOf(jwtVal), JWTCert);
jwtVal += '.' + base64URLencode(signature);
return jwtVal;
}
catch(exception ex)
{
system.debug(ex.getMessage());
return '';
}
}
private system.JSONGenerator GenerateJsonHeader()
{
try
{
JSONGenerator header = JSON.createGenerator(false);
header.writeStartObject();
header.writeStringField(JWTConst.algKey, JWTConst.algval);
header.writeStringField(JWTConst.typkey, JWTConst.typval);
header.writeEndObject();
return header;
}
catch(exception ex)
{
system.debug(ex.getMessage());
return null;
}
}
private system.JSONGenerator GenerateJsonPayload()
{
try
{
JSONGenerator Payload = JSON.createGenerator(false);
Payload.writeStartObject();
string JitVal = EncodingUtil.convertToHex(Crypto.generateDigest('MD5', Blob.valueOf(DateTime.now().getTime().format())));
Payload.writeStringField(JWTConst.jtiKey, JitVal);
Payload.writeStringField(JWTConst.isskey, JWTConst.issVal);
Payload.writeStringField(JWTConst.audKey, JWTConst.audVal);
Long iatVal = (dateTime.now().getTime()/1000)+1;
Payload.writeNumberField(JWTConst.iatkey, iatVal);
long nbfval = iatval+ JWTConst.Validity;
Payload.writeNumberField(JWTConst.nbfkey, nbfval);
long expval = iatval+ JWTConst.Validity+1;
Payload.writeNumberField(JWTConst.expKey, expval);
Payload.writeStringField(JWTConst.emailKey, GlobalUser.email);
Payload.writeStringField(JWTConst.typekey, JWTConst.typeEmailval);
Payload.writeEndObject();
return Payload;
}
catch(exception ex)
{
system.debug(ex.getMessage());
return null;
}
}
}
public interface IRealMeInterface {
string GetRealmeToken(String Endpoint, IJWTBuilder JWTBuilder);
}
public class RealmeImplementation implements IRealMeInterface
{
public string GetRealmeToken(String Endpoint, IJWTBuilder JWTBuilder)
{
try
{
String grantType = 'urn:ietf:params:oauth:grant-type:jwt-bearer';
String access_token = null;
String body = 'grant_type='+EncodingUtil.urlEncode(grantType, 'UTF-8')+'&assertion=' + JWTBuilder.BuildJWT();
HttpRequest req = new HttpRequest();
req.setMethod(JWTConst.post);
req.setHeader('Content-type', 'application/json; charset=UTF-8');
req.setBody(body);
Http http = new Http();
HTTPResponse res = http.send(req);
return '';
}
catch(exception ex)
{
system.debug(ex.getMessage());
return '';
}
}
}
Comments
Post a Comment