无命令行环境下Salesforce对接Google Translate v3 Advanced API认证问询
Salesforce对接Google Translate Advanced V3 API 无命令行权限解决方案
核心思路:使用JWT认证流程
Google Translate Advanced V3不支持API密钥,但可通过JWT令牌认证实现对接,全程无需命令行操作,仅依赖Salesforce的Apex代码和HTTP调用即可完成。
具体步骤:
创建并获取Google服务账号密钥
- 登录Google Cloud控制台,创建服务账号并为其分配「Cloud Translation API Editor」角色。
- 下载服务账号的JSON密钥文件,提取其中的
private_key、client_email字段信息(建议存储在Salesforce自定义设置或加密字段中,避免硬编码泄露)。
在Salesforce中生成签名后的JWT
用Apex代码构建JWT并完成RS256签名,示例代码如下:public class GoogleJWTGenerator { public static String generateJWT(String clientEmail, String privateKey) { // 构建JWT Header Map<String, Object> header = new Map<String, Object>{ 'alg' => 'RS256', 'typ' => 'JWT' }; String encodedHeader = base64UrlEncode(JSON.serialize(header)); // 构建JWT Payload(有效期1小时) Long expTime = DateTime.now().getTime()/1000 + 3600; Map<String, Object> payload = new Map<String, Object>{ 'iss' => clientEmail, 'aud' => 'https://oauth2.googleapis.com/token', 'scope' => 'https://www.googleapis.com/auth/cloud-translation', 'exp' => expTime }; String encodedPayload = base64UrlEncode(JSON.serialize(payload)); // 拼接待签名字符串 String signatureInput = encodedHeader + '.' + encodedPayload; // 使用私钥签名 Blob privateKeyBlob = EncodingUtil.base64Decode(privateKey.replace('-----BEGIN PRIVATE KEY-----', '').replace('-----END PRIVATE KEY-----', '').replace('\n', '')); Blob signatureBlob = Crypto.sign('RSA-SHA256', Blob.valueOf(signatureInput), privateKeyBlob); String encodedSignature = base64UrlEncode(signatureBlob); // 返回完整JWT return encodedHeader + '.' + encodedPayload + '.' + encodedSignature; } private static String base64UrlEncode(Blob input) { String encoded = EncodingUtil.base64Encode(input); return encoded.replace('+', '-').replace('/', '_').replace('=', ''); } }获取Google OAuth Access Token
用生成的JWT向Google令牌端点发送POST请求,获取Bearer Token:public static String getAccessToken(String jwt) { Http http = new Http(); HttpRequest req = new HttpRequest(); req.setEndpoint('https://oauth2.googleapis.com/token'); req.setMethod('POST'); req.setHeader('Content-Type', 'application/x-www-form-urlencoded'); req.setBody('grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=' + jwt); HttpResponse res = http.send(req); if(res.getStatusCode() == 200) { Map<String, Object> respMap = (Map<String, Object>)JSON.deserializeUntyped(res.getBody()); return (String)respMap.get('access_token'); } throw new Exception('获取Token失败:' + res.getBody()); }调用Google Translate V3 API
使用获取到的Access Token发起翻译请求,示例调用文本翻译接口:public static String translateText(String accessToken, String projectId, String text, String targetLang) { Http http = new Http(); HttpRequest req = new HttpRequest(); req.setEndpoint('https://translation.googleapis.com/v3/projects/' + projectId + ':translateText'); req.setMethod('POST'); req.setHeader('Authorization', 'Bearer ' + accessToken); req.setHeader('Content-Type', 'application/json'); Map<String, Object> requestBody = new Map<String, Object>{ 'targetLanguageCode' => targetLang, 'contents' => new List<String>{text} }; req.setBody(JSON.serialize(requestBody)); HttpResponse res = http.send(req); if(res.getStatusCode() == 200) { Map<String, Object> respMap = (Map<String, Object>)JSON.deserializeUntyped(res.getBody()); List<Object> translations = (List<Object>)respMap.get('translations'); if(translations.size() > 0) { Map<String, Object> translation = (Map<String, Object>)translations[0]; return (String)translation.get('translatedText'); } } throw new Exception('翻译请求失败:' + res.getBody()); }
注意事项:
- 确保Salesforce远程站点设置已添加
https://oauth2.googleapis.com和https://translation.googleapis.com域名。 - 服务账号私钥需妥善存储,建议使用Salesforce加密字段或命名凭据管理。
- JWT有效期建议设为1小时,每次调用API前可检查Token是否过期,过期则重新生成。
内容的提问来源于stack exchange,提问作者Paul Battisson
相关产品推荐
相关产品推荐

