You need to sign in to do that
Don't have an account?
Gokul 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",
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",
Shashank (Salesforce Developers)
You may find this helpful: https://theforcetimes.wordpress.com/2012/12/15/integration-of-google-drive-into-force-com/