1

Force.comのApexでJWTを生成しようとしていますが、400の「エラー」:「invalid_grant」が発生し続けます。さまざまなバリエーションを試しましたが、有効な応答が得られません。clientEmailAddressは正しいです(例:##@developer.gserviceaccount.com)。openSSLを使用して秘密鍵の値を抽出しました。ボード上の他の投稿に基づいてbase64URLエンコードするメソッドを作成しました。どんな助けでも大歓迎です。

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);
}
4

1 に答える 1