Friday, October 16, 2020

Salesforce OAuth Connection without Username and Password using JWT and C#

Hi All,

Please find the code to Convert JWT to PCKS

keytool -importkeystore -srckeystore LocalfolderPath\FileName.jks -destkeystore LocalfolderPath\FileName.cer -srcstoretype JKS -deststoretype PKCS12 -deststorepass password


keytool -importkeystore -srckeystore LocalfolderPath\FileName.jks -destkeystore LocalfolderPath\FileName.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass password -deststorepass gridserve -srcalias Randomname2020 -destalias 1 -srckeypass password-destkeypass password–noprompt


LocalfolderPath\FileName.jks - JKS File
LocalfolderPath\FileName.cer - PKCS File(Certificate)
password - Password for JKS



static string ToBase64UrlString(byte[] input)
        {
            return Convert.ToBase64String(input).TrimEnd('=').Replace('+', '-').Replace('/', '_');
        }

        //Create Lead
        public static GetLeadResults createLead(string access_token)
        {
            var clientSend = new RestClient("https://orgName.salesforce.com/services/data/v49.0/sobjects/Lead");
            var requestSend = new RestRequest(Method.POST);
            requestSend.AddHeader("postman-token", "93331841-f3d2-de3e-dbcf-309a32fa1a7c");
            requestSend.AddHeader("cache-control", "no-cache");
            requestSend.AddHeader("content-type", "application/json");
            requestSend.AddHeader("authorization", "Bearer " + access_token);
            requestSend.AddParameter("application/json", "{ "FirstName": "Raghu"} ", ParameterType.RequestBody);
            IRestResponse responseSend = clientSend.Execute(requestSend);
            GetLeadResults getCreatedResults = JsonConvert.DeserializeObject<GetLeadResults>(responseSend.Content);
            return getCreatedResults;
        }

        public static GenerateToken GetAccessToken()
        {
            // certificate
            //X509Certificate2 certificate = new X509Certificate2(@"localpath\filename.pfx", "password", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);

            // header
            var header = new { alg = "RS256" };

            var claimset = new
            {
                iss = "client_id",
                sub = "Email",
                aud = "https://test.salesforce.com",
                exp = expiryDate,
            };
            var ser = new JavaScriptSerializer();

            // encoded header
            var headerSerialized = ser.Serialize(header);
            var headerBytes = Encoding.UTF8.GetBytes(headerSerialized);
            var headerEncoded = ToBase64UrlString(headerBytes);

            // encoded claimset
            var claimsetSerialized = ser.Serialize(claimset);
            var claimsetBytes = Encoding.UTF8.GetBytes(claimsetSerialized);
            var claimsetEncoded = ToBase64UrlString(claimsetBytes);

            // input
            var input = headerEncoded + "." + claimsetEncoded;
            var inputBytes = Encoding.UTF8.GetBytes(input);

            // signiture
            var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
            var signingCredentials = new X509SigningCredentials(certificate, "RS256");
            var signature = JwtTokenUtilities.CreateEncodedSignature(input, signingCredentials);

            // jwt
            var jwt = headerEncoded + "." + claimsetEncoded + "." + signature;

            var client = new WebClient();
            client.Encoding = Encoding.UTF8;

            var content = new NameValueCollection();

            var clients = new RestClient("https://org.salesforce.com/services/oauth2/token");
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            var request = new RestRequest(Method.POST);
            request.AddHeader("cache-control", "no-cache");
            request.AddHeader("content-type", "application/x-www-form-urlencoded");
            //request.AddHeader("authorization", "client_id:3MVG9uAc45HBYUriJoqjtxJLD.1f.Vptl72m7pFWVLcdgslPKKdE8K31RrUqiqDS5y2bTvu99B.OcdhSaK9c9, " +
            //    "client_secret:79A8DC7B0586433932A6EB846C76C8920145DFE7AE0BE0B28ED076C5397F9ADC");
            request.AddHeader("authorization", "client_id:clientid,client_secret:clientSecret");
            request.AddParameter("application/x-www-form-urlencoded", "assertion=" + jwt +
                "&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer", ParameterType.RequestBody);
            IRestResponse response = clients.Execute(request);

            GenerateToken customerDto = JsonConvert.DeserializeObject<GenerateToken>(response.Content);

            return customerDto;
        }

        public class GenerateToken
        {
            public string access_token { get; set; }
            public string scope { get; set; }
            public string instance_url { get; set; }
            public string token_type { get; set; }
            public string id { get; set; }
        }

        private static int GetExpiryDate()
        {
            var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            var currentUtcTime = DateTime.UtcNow;

            var exp = (int)currentUtcTime.AddMinutes(4).Subtract(utc0).TotalSeconds;

            return exp;
        }

        public class GetLeadResults
        {
            public string id { get; set; }
            public string success { get; set; }
            public string[] errors { get; set; }
        }

How to Clear Cache in Canvas PowerApps while working on Offline mode?

  Introduction In this blog, we’ll look at how to clear cache in Canvas Apps when using the Power Apps mobile application, especially when t...