function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Gokul  BharatiGokul Bharati 

I am trying to connect to Google drive API from Apex using JWT to retrieve Oauth 2.0 token

Hi All,

I am trying to connect  to Google drive API  from Apex using JWT to retrieve Oauth 2.0 token.Google isnt accepting my assertion values (JWT) and its returning an invalid Grant message.Can you please help.

Please find the below code and sample key:

public Class GoogleSalesforceDrive{

public static void AuthenticateGoogle(){
        
        http h = new Http();
        Httprequest req = new HttpRequest();
        HttpResponse res = new HttpResponse();
        
        req.setEndpoint('https://accounts.google.com/o/oauth2/token');
        req.setMethod('POST');
        req.setHeader('ContentType','application/x-www-form-urlencoded');
        
        String Header = '{"alg":"RS256","typ":"JWT"}';
        
        String Header_Encode = EncodingUtil.base64Encode(blob.valueof(Header));
        
        String claim_set = '{"iss":"427541316564-7ljpoen8etct2b9odjsonl9r6fcdvna2@developer.gserviceaccount.com"';
        claim_set += ',"scope":"https://www.googleapis.com/auth/drive"';
        claim_set += ',"aud":"https://accounts.google.com/o/oauth2/token"';
        claim_set += ',"exp":"'+datetime.now().addHours(1).getTime()/1000;
        claim_set += '","iat":"'+datetime.now().getTime()/1000+'"}';
        
        String claim_set_Encode = EncodingUtil.base64Encode(blob.valueof(claim_set));
        
        String Singature_Encode = Header_Encode+'.'+claim_set_Encode;
        Singature_Encode = Singature_Encode.replaceAll('=','');
        Singature_Encode  = EncodingUtil.urlEncode(Singature_Encode,'UTF-8');
        String key = 'MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMTn4BfNstsUDqw1dO3UYiHFeZWkQwFu0nQGdRf7khlqAEmtMTWsTUUhIsju/j6mqtSP+qCLzimMOu4PAo6wEHGqYGuGqHTBUYxvfmm3escyt4/GTKGgCnJU2cTPd3IxY0E771NW+IwXNY8J3sp5wGi8Uz7W+Cs6nPRHNPnEORoVAgMBAAECgYAaRjqf0oHgO9/tWMC+j418piYgMqgCQ/BvLQFo7tfC7mMVcbfUSqaQ5+gFWeaxI3o+HOw7igw7fQvMAlK8CYBX/mDbbP0ttIF0mOmI+JOZ/4u8Rj0rNDg6p1XFPQNUsPAWhSNQ+FxFyAaKAVd40ZQ744psM/fePDEVDfCL+HuhQQJBAPM6cAlNjlsGBBByVso/1tvlhlilx3EZeaLJZV6FTdE4ebp5ChEhsJPTCZ3liY72ekg1lJmVpIEtPkVzJQ12NwUCQQDPPsD5x9ZHaArdCbxF01Jffkof1C896rXnxONTicoWUMrslHbkFjO06CfOs1BI0J8ZRRq6UtvZ3M62n2/OVqPRAkAoy3RfGxL1UVz9JTBJW8u9thGCbMu2vH8aPo0x/Um//ajtDcASf4QORyclxIn94HlCAzqZR+//eocnPtjIGTvBAkAijqQ/AkOIxKCLGwR54DLsGXLiu87k1C5g50PAukkoT3CG4nqwrcMRd2Sr4tqQSbk9zXgXeZmPSnJtoUhTb78BAkAfYjmtERN0smdt4c79lQftajADMhkYx+Z9Tro2f+e+CvheOYWpwQiG+983KtbJRNm7C9LwKqgsr0A6Q6ddzfnq';
        blob privateKey = EncodingUtil.base64Decode(key);
        
        blob Signature_b =   blob.valueof(Singature_Encode);
        
        String Sinatute_blob = EncodingUtil.base64Encode(Crypto.sign('RSA-SHA256', Signature_b , privateKey));   
        
        String JWT = Singature_Encode+'.'+Sinatute_blob;
        JWT = JWT.replaceAll('=','');
        String grt = 'urn:ietf:params:oauth:grant-type:jwt-bearer';
        system.debug('%%%%%%%%JWT'+JWT);
        req.setBody('grant_type='+grt+'&assertion='+JWT);
        res = h.send(req);
        String Response = res.getBody() +' '+ res.getStatusCode();
        system.debug('Response ='+Response);
       
     } 
    }

Key:
"private_key": "-----BEGIN PRIVATE KEY-----\nMIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAMTn4BfNstsUDqw1\ndO3UYiHFeZWkQwFu0nQGdRf7khlqAEmtMTWsTUUhIsju/j6mqtSP+qCLzimMOu4P\nAo6wEHGqYGuGqHTBUYxvfmm3escyt4/GTKGgCnJU2cTPd3IxY0E771NW+IwXNY8J\n3sp5wGi8Uz7W+Cs6nPRHNPnEORoVAgMBAAECgYAaRjqf0oHgO9/tWMC+j418piYg\nMqgCQ/BvLQFo7tfC7mMVcbfUSqaQ5+gFWeaxI3o+HOw7igw7fQvMAlK8CYBX/mDb\nbP0ttIF0mOmI+JOZ/4u8Rj0rNDg6p1XFPQNUsPAWhSNQ+FxFyAaKAVd40ZQ744ps\nM/fePDEVDfCL+HuhQQJBAPM6cAlNjlsGBBByVso/1tvlhlilx3EZeaLJZV6FTdE4\nebp5ChEhsJPTCZ3liY72ekg1lJmVpIEtPkVzJQ12NwUCQQDPPsD5x9ZHaArdCbxF\n01Jffkof1C896rXnxONTicoWUMrslHbkFjO06CfOs1BI0J8ZRRq6UtvZ3M62n2/O\nVqPRAkAoy3RfGxL1UVz9JTBJW8u9thGCbMu2vH8aPo0x/Um//ajtDcASf4QORycl\nxIn94HlCAzqZR+//eocnPtjIGTvBAkAijqQ/AkOIxKCLGwR54DLsGXLiu87k1C5g\n50PAukkoT3CG4nqwrcMRd2Sr4tqQSbk9zXgXeZmPSnJtoUhTb78BAkAfYjmtERN0\nsmdt4c79lQftajADMhkYx+Z9Tro2f+e+CvheOYWpwQiG+983KtbJRNm7C9LwKqgs\nr0A6Q6ddzfnq\n-----END PRIVATE KEY-----\n",

 
ShashankShashank (Salesforce Developers) 
You may find this helpful: https://theforcetimes.wordpress.com/2012/12/15/integration-of-google-drive-into-force-com/