我正在尝试通过Salesforce.com中的服务帐户向Google的DFP广告管理系统进行身份验证。我在以前的用户/凭据对下进行了集成,但我需要更新为新用户。
我在Google Developer Console中创建了项目/用户/密钥对,并在DFP广告管理系统中将新服务帐户添加到了网络中。然后我改变了" iss"值将成为新用户的电子邮件,私钥将成为密钥对中的新私钥。
我现在收到了“无效签名”#39;错误。
在SFDC中,我使用Crypto.sign方法和RSA-SHA256。
我已经验证了密钥格式为PKCS#8,并且每个文档都删除了标题和新行字符(我甚至解码了ASN.1格式并检查节点是否符合要求)。
我是否错过了用户与正确凭据之间连接的步骤?有没有办法让我验证我在本地生产的签名,看看我哪里出错了?我看到的唯一区别是旧私钥比当前私钥短。
以下是我用来生成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 :(得分:0)
几天后,我找到了解决问题的另一种解决方案。问题是base64urlsafe编码。此编码不是在SFDC中本机完成的,并且描述了从base64字符串中删除尾随填充字符。幸运的是,我的原始用户名在声明集中没有填充字符编码。使用新用户名时,填充字符存在,必须在签名前删除。
这一切只归结为几个角色。