2013-01-22 31 views
1

我想在Force.com上的Apex上生成一个JWT,但不断得到一个400“错误”:“invalid_grant”。我尝试了很多变化,但只是无法得到有效的回应。我的客户电子邮件地址是正确的(例如,##@developer.gserviceaccount.com)。我使用openSSL提取了我的私钥的值。我写了一个基于主板上其他帖子的base64URL编码方法。任何帮助将不胜感激。Force.com Apex代码来生成Google API oAuth 2.0 JWT

public static 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 static void generateJWT(){ 
    Long rightNow = (dateTime.now().getTime()/1000)+1; 

    JSONGenerator gen = JSON.createGenerator(false); 
    gen.writeStartObject(); 
    gen.writeStringField('iss',clientEmailAddress); 
    gen.writeStringField('scope','https:\\/\\/www.googleapis.com\\/auth\\/prediction'); 
    gen.writeStringField('aud','https:\\/\\/accounts.google.com\\/o\\/oauth2\\/token'); 
    gen.writeNumberField('exp',rightNow+300);  
    gen.writeNumberField('iat',rightNow); 
    String claimSet = gen.getAsString().trim(); 

    String header = '{"alg":"RS256","typ":"JWT"}'; 
    String signatureInput = base64URLencode(blob.valueOf(header))+'.'+base64URLencode(blob.valueOf(claimSet)); 

    Blob signature = crypto.sign('RSA', blob.valueOf(signatureInput), encodingUtil.base64decode(privatekey)); 

    String jwt = signatureInput+'.'+base64URLencode(signature); 

    http h = new http(); 
    httpRequest req = new httpRequest(); 
    req.setHeader('Content-Type','application/x-www-form-urlencoded'); 
    req.setMethod('POST'); 
    req.setBody('grant_type='+encodingUtil.urlEncode('urn:ietf:params:oauth:grant-type:jwt-bearer','UTF-8')+'&assertion='+encodingUtil.urlEncode(jwt,'UTF-8')); 
    req.setEndpoint('https://accounts.google.com/o/oauth2/token'); 
    httpResponse res = h.send(req); 
} 
+0

你有没有想出解决办法? –

+0

嘿男人!我面临同样的问题!你有答案吗? http://salesforce.stackexchange.com/questions/13301/connect-apex-and-google-api-using-jwt-to-retrieve-oauth-2-0-token – Sathya

+0

我认为这个问题的不幸答案可能存在[这里] [1]。 [1]:http://salesforce.stackexchange.com/questions/13301/connect-apex-and-google-api-using-jwt-to-retrieve-oauth-2-0-token/ 13375#13375 –

回答

0

我觉得方法名是Base64encode但不base64urlencode