You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Node.js调用Salesforce API创建Case时遇invalid_grant认证错误

Salesforce API 创建Case时的认证错误问题

问题描述

我正在开发一个通过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);
});

解决建议

  1. 检查密码与安全令牌的拼接逻辑
    确认密码和安全令牌之间没有多余空格或特殊字符,手动拼接成完整字符串后,用Postman直接测试认证请求,排除代码拼接的问题。

  2. 验证连接应用的IP限制配置
    即使服务器IP已加入可信范围,也要检查连接应用的「IP Relaxation」设置:如果设为「Relax IP restrictions」,则可信IP规则不生效;如果设为「Enforce IP restrictions」,需确保服务器IP在可信列表内,且连接应用的「Connected App IP Addresses」无单独限制。

  3. 排查用户账户状态

    • 确认用户账户未被锁定或禁用。
    • 检查用户是否需要修改密码(Salesforce会强制新用户或过期密码用户修改密码,此时即使凭据正确也会认证失败)。
    • 确认用户已获得该连接应用的「Connected App Access」权限:在用户详情页的「Connected Apps」板块查看授权状态。
  4. 用原始请求测试认证流程
    用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配置或凭据本身。

  5. 确认实例URL正确性
    检查实例URL是否与用户实际登录的Salesforce实例匹配,避免沙盒与生产环境混淆,可通过登录Salesforce后查看地址栏确认实例域名。

  6. 启用Salesforce调试日志
    在Salesforce中为该用户开启「Debug Logs」,设置日志级别为DEBUG,触发认证请求后查看日志详情,直接定位认证失败的具体原因(如权限不足、凭据校验失败等)。


内容的提问来源于stack exchange,提问作者Raheel Ashraf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:54:56