Ich versuche, mich über ein Dienstkonto von Salesforce.com bei Google DFP zu authentifizieren. Ich hatte die Integration unter einem vorherigen Benutzer-/Berechtigungsnachweis-Paar, aber ich muss auf einen neuen Benutzer aktualisieren.Google JWT ungültige Signatur von Salesforce
Ich habe das Projekt/Benutzer/Schlüsselpaar in der Google Developer Console erstellt und das neue Dienstkonto dem Netzwerk in DFP hinzugefügt. Ich habe dann den "iss" -Wert geändert, um die E-Mail des neuen Benutzers zu sein, und den privaten Schlüssel als neuen privaten Schlüssel aus dem Schlüsselpaar.
Ich erhalte jetzt einen Fehler 'ungültige Signatur'.
In SFDC verwende ich Crypto.sign-Methode mit RSA-SHA256.
ich das Schlüsselformat validiert PKCS # 8 mit Kopf und neuen Zeilen Zeichen pro der Dokumentation entfernt zu sein (Ich ging so weit, das ASN.1-Format zu dekodieren und die Knoten für Konformität überprüfen) .
Habe ich einen Schritt in der Verbindung zwischen dem Benutzer und den richtigen Anmeldeinformationen verpasst? Gibt es eine Möglichkeit für mich, die Signatur, die ich lokal produziere, zu validieren, um zu sehen, wo ich falsch liege? Der einzige Unterschied, den ich gesehen habe, ist, dass der alte private Schlüssel kürzer als der aktuelle private Schlüssel war.
Unten ist der Code, den ich verwende, um den JWT zu generieren (dieser Code funktionierte wiederum mit einem anderen Benutzernamen und einem anderen Berechtigungsschlüssel).
JWTHeader head = new JWTHeader();
head.alg = 'RS256';
head.typ = 'JWT';
JWTClaimSet claim = new JWTClaimSet();
claim.iss = '<username>@*.iam.gserviceaccount.com';
claim.scope = 'https://www.googleapis.com/auth/dfp';
claim.aud = 'https://accounts.google.com/o/oauth2/token';
claim.iat = DateTime.now().getTime()/1000;
claim.exp = claim.iat + 3600;
System.debug(JSON.serialize(head));
System.debug(JSON.serialize(claim));
String key = '<privatekey>’;
String base = EncodingUtil.urlEncode(EncodingUtil.base64Encode(Blob.valueOf(JSON.serialize(head))), 'UTF-8') + '.' + EncodingUtil.urlEncode(EncodingUtil.base64Encode(Blob.valueOf(JSON.serialize(claim))), 'UTF-8');
String sig = EncodingUtil.urlEncode(EncodingUtil.base64Encode(Crypto.sign('RSA-SHA256', Blob.valueOf(base), EncodingUtil.base64Decode(key))), 'UTF-8');
String body = base + '.' + sig;
System.debug(body);
Http http = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint('https://accounts.google.com/o/oauth2/token');
req.setBody('grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=' + body);
req.setHeader('Content-Type', 'application/x-www-form-urlencoded');
req.setMethod('POST');
HttpResponse resp = http.send(req);