0

Salesforce.comからGoogleのDFPへのサービスアカウントを使用して認証しようとしています。以前のユーザーと資格情報のペアで統合を行っていましたが、新しいユーザーに更新する必要があります。Google JWT Salesforceの署名が無効

Googleデベロッパーコンソールでプロジェクト/ユーザー/キーのペアを作成し、その新しいサービスアカウントをDFPのネットワークに追加しました。私はその後、 "iss"の値を新しいユーザーの電子メールに変更し、秘密鍵を鍵ペアから新しい秘密鍵に変更しました。

「署名が無効です」というエラーが表示されます。

SFDCでは、私はRSA-SHA256でCrypto.signメソッドを使用しています。

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

Iは、(私はこれまでASN.1フォーマットをデコードし、適合のためにノードを検査するように行った)ドキュメントごと除去ヘッダと改行文字でPKCS#8であることキーフォーマットを検証しました。

ユーザーと正しい資格情報の間の接続にステップがありませんでしたか?私が間違っている場所を見るために私が現地で生産している署名を検証する方法はありますか?私が見た唯一の違いは、古い秘密鍵が現在の秘密鍵よりも短いことです。

以下はJWTを生成するために使用しているコードです(ここでも、このコードは別のユーザー名と資格情報キーで正しく機能しています)。

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

答えて

0

日後、私はこの問題を解決する別の解決策を見つけました。問題は、base64urlsafeエンコーディングでした。このエンコーディングはSFDCでネイティブに実行されず、base64文字列から末尾のパディング文字が削除されることを宣言します。幸運にも、私のオリジナルのユーザ名は、クレームセットにパディング文字なしでエンコードされています。新しいユーザー名では、パディング文字が存在し、署名前に削除する必要があります。

すべてがわずか数文字になります。