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

Popular posts from this blog

The Salesforce Certification Frenzy: Balancing Quantity with Quality in a Changing Market