使用Node.js调用Salesforce API创建Case时遇invalid_grant认证错误
问题描述
我正在开发一个通过Salesforce API创建Case的项目,但反复检查凭据后仍无法解决认证错误。调用API创建Case时,收到以下错误:
Error: Response data: { error: 'invalid_grant', error_description: 'authentication failure' }
已完成的排查步骤
- 验证环境变量中配置的Salesforce用户名、密码、安全令牌、Consumer Key和Consumer Secret均正确。
- 确认Salesforce账户已启用API访问权限。
- 将服务器IP地址添加至Salesforce的可信IP范围。
- 检查Salesforce连接应用设置,确认OAuth权限范围和回调URL配置正确。
- 在认证请求中对用户名和密码进行了URL编码。
- 在代码中添加详细日志,捕获认证过程的请求和响应。
- 使用API版本v58.0。
- 使用标准端点
/services/oauth2/token获取访问令牌。 - 确认未使用过期的访问令牌。
- 服务器时钟已正确同步。
- 确认未触发Salesforce API速率限制。
- 排查了可能影响与Salesforce服务器通信的网络问题。
尽管完成以上步骤,认证错误依然存在,怀疑遗漏了认证流程中的关键环节。
相关代码
const axios = require('axios'); const dotenv = require('dotenv'); dotenv.config(); const SALESFORCE_USERNAME = process.env.SALESFORCE_USERNAME; const SALESFORCE_PASSWORD = process.env.SALESFORCE_PASSWORD; const SALESFORCE_SECURITY_TOKEN = process.env.SALESFORCE_SECURITY_TOKEN; const SALESFORCE_CONSUMER_KEY = process.env.SALESFORCE_CONSUMER_KEY; const SALESFORCE_CONSUMER_SECRET = process.env.SALESFORCE_CONSUMER_SECRET; const SALESFORCE_INSTANCE_URL = 'https://platform-app-826.my.salesforce.com'; const API_VERSION = 'v58.0'; async function createSalesforceCase() { try { const authRequestData = new URLSearchParams({ grant_type: 'password', client_id: SALESFORCE_CONSUMER_KEY, client_secret: SALESFORCE_CONSUMER_SECRET, username: encodeURIComponent(SALESFORCE_USERNAME), password: encodeURIComponent(`${SALESFORCE_PASSWORD}${SALESFORCE_SECURITY_TOKEN}`) }); const authResponse = await axios.post( `${SALESFORCE_INSTANCE_URL}/services/oauth2/token`, authRequestData.toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } } ); const accessToken = authResponse.data.access_token; console.log('Salesforce Authentication Successful'); const customerPhoneNumber = '+1234567890'; const customerQuery = 'This is a test query from the customer.'; const caseData = { Subject: `Amazon Connect case from ${customerPhoneNumber}`, Description: customerQuery, Priority: 'Medium', Origin: 'Phone', Comments: `Rider Phone number is ${customerPhoneNumber}` }; try { if (!accessToken) { throw new Error('Access token not available.'); } const response = await axios.post( `${SALESFORCE_INSTANCE_URL}/services/data/${API_VERSION}/sobjects/Case`, caseData, { headers: { Authorization: `Bearer ${accessToken}`, 'Content-Type': 'application/json' } } ); console.log('Case ID:', response.data.id); } catch (err) { console.error('Error creating case:', err.message); } } catch (err) { console.error('Error during authentication:', err.message); if (err.response) { console.error('Response data:', err.response.data); } } } createSalesforceCase().catch(err => { console.error('Unhandled error:', err.message); });
解决建议
检查密码与安全令牌的拼接逻辑
确认密码和安全令牌之间没有多余空格或特殊字符,手动拼接成完整字符串后,用Postman直接测试认证请求,排除代码拼接的问题。验证连接应用的IP限制配置
即使服务器IP已加入可信范围,也要检查连接应用的「IP Relaxation」设置:如果设为「Relax IP restrictions」,则可信IP规则不生效;如果设为「Enforce IP restrictions」,需确保服务器IP在可信列表内,且连接应用的「Connected App IP Addresses」无单独限制。排查用户账户状态
- 确认用户账户未被锁定或禁用。
- 检查用户是否需要修改密码(Salesforce会强制新用户或过期密码用户修改密码,此时即使凭据正确也会认证失败)。
- 确认用户已获得该连接应用的「Connected App Access」权限:在用户详情页的「Connected Apps」板块查看授权状态。
用原始请求测试认证流程
用curl或Postman发送无编码的认证请求,排除代码URL编码的问题:curl -X POST "https://platform-app-826.my.salesforce.com/services/oauth2/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "grant_type=password&client_id=你的ConsumerKey&client_secret=你的ConsumerSecret&username=你的用户名&password=你的密码你的安全令牌"若请求成功,说明代码编码逻辑有问题;若失败,问题出在Salesforce配置或凭据本身。
确认实例URL正确性
检查实例URL是否与用户实际登录的Salesforce实例匹配,避免沙盒与生产环境混淆,可通过登录Salesforce后查看地址栏确认实例域名。启用Salesforce调试日志
在Salesforce中为该用户开启「Debug Logs」,设置日志级别为DEBUG,触发认证请求后查看日志详情,直接定位认证失败的具体原因(如权限不足、凭据校验失败等)。
内容的提问来源于stack exchange,提问作者Raheel Ashraf

