Salesforce Connected App配置:如何用永久API密钥认证RestResource
方案一:自定义API密钥认证(最适配外部服务限制)
这种方式无需依赖OAuth2,直接通过请求头传递永久API密钥,完全匹配外部服务只能硬编码单个键值对的要求,同时可精准控制访问权限。
步骤1:存储API密钥
创建自定义设置(Custom Setting)或自定义元数据类型(Custom Metadata Type),例如命名为API_Key_Settings,包含字段:API_Key__c(存储密钥值)、Allowed_Endpoint__c(指定允许访问的RestResource路径,比如/services/apexrest/myendpoint)。手动添加一条记录,填入预设密钥和允许的端点路径。步骤2:修改RestResource类添加认证逻辑
在RestResource的POST方法开头加入认证检查,示例代码如下:@RestResource(urlMapping='/myendpoint/*') global class MyRestResource { @HttpPost global static void handlePost() { // 从请求头获取API密钥 RestRequest req = RestContext.request; String apiKey = req.headers.get('X-API-Key'); // 验证密钥有效性 API_Key_Settings__c setting = API_Key_Settings__c.getInstance('Default'); if (apiKey == null || !apiKey.equals(setting.API_Key__c)) { RestContext.response.statusCode = 401; RestContext.response.responseBody = Blob.valueOf('Unauthorized: Invalid API Key'); return; } // 验证是否允许访问当前端点 String currentEndpoint = req.requestURI; if (!currentEndpoint.contains(setting.Allowed_Endpoint__c)) { RestContext.response.statusCode = 403; RestContext.response.responseBody = Blob.valueOf('Forbidden: Endpoint not allowed'); return; } // 原有业务逻辑:生成平台事件等 // ... } }步骤3:外部服务配置
在外部服务的请求头中硬编码:X-API-Key: [你设置的密钥值],直接调用RestResource端点即可。
方案二:Connected App + JWT认证(长期有效令牌)
如果必须使用Connected App,JWT认证可生成有效期最长10年的令牌,但要求外部服务支持生成JWT签名(若外部服务无法生成JWT,此方案不适用)。
步骤1:配置Connected App
- 创建Connected App,启用JWT Bearer Flow,上传数字证书公钥。
- 在
OAuth Settings中设置令牌有效期为最大值(10年),并添加api权限范围。 - 限制访问范围:
- 设置IP限制,仅允许外部服务的IP地址访问。
- 创建专用Profile,仅授予该Profile访问目标RestResource Apex类的权限,将JWT认证用的用户分配到该Profile。
步骤2:生成长期JWT令牌
使用私钥生成JWT令牌,将exp(过期时间)设置为10年后的时间戳,外部服务将该令牌硬编码在请求头Authorization: Bearer [JWT令牌]中,令牌到期前永久有效。
方案三:Connected App + 刷新令牌(半自动永久访问)
若外部服务支持存储刷新令牌,可采用OAuth2的Authorization Code Flow,获取刷新令牌后定期自动刷新访问令牌。但此方案需要外部服务处理令牌刷新逻辑,不符合“仅硬编码单个变量”的要求,仅作为补充参考。
- 所有方案都要严格限制IP访问,避免密钥/令牌被滥用。
- 自定义API密钥需定期轮换,即使是永久密钥,也建议每隔一段时间更新并同步外部服务配置。
- 使用JWT认证时,必须妥善保管私钥,一旦泄露立即更换证书并重新配置Connected App。
内容的提问来源于stack exchange,提问作者Nicolas

