0

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.

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restful_crypto.htm#apex_System_Crypto_sign

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

Antwort

0

Tage später fand ich eine andere Lösung, die das Problem löste. Das Problem war die Codierung von base64urlsafe. Diese Kodierung wird nicht nativ in SFDC ausgeführt und schreibt das Entfernen von abschließenden Füllzeichen aus der Base64-Zeichenfolge vor. Glücklicherweise ist mein ursprünglicher Benutzername ohne Füllzeichen im Anspruchssatz codiert. Mit dem neuen Benutzernamen sind die Füllzeichen vorhanden und müssen vor dem Signieren entfernt werden.

Es kommt nur auf ein paar Zeichen an.

Verwandte Themen