87

我正在尝试使用 OAuth 身份验证来获取 Salesforce 身份验证令牌,所以我参考了wiki 文档,但是在获取授权代码之后,当我使用 5 个必需参数发出 Post 请求时,我得到了以下异常

{"error":"invalid_grant","error_description":"authentication failure"} CODE 400
JSON = {"error":"invalid_grant","error_description":"authentication failure"}

我猜这是一个糟糕的要求。

PostMethod post = new PostMethod("https://login.salesforce.com/services/oauth2/token");
post.addParameter("code",##############);
post.addParameter("grant_type","authorization_code");
post.addParameter("redirect_uri","#################");  
post.addParameter("client_id",this.client_id);
post.addParameter("client_secret",this.client_secret);
httpclient.executeMethod(post);
String responseBody = post.getResponseBodyAsString();
System.out.println(responseBody+" CODE "+post.getStatusCode());

请回复,如果知道异常?

4

13 回答 13

208

对于任何像我一样陷入困境和沮丧的人,我已经在整个过程中留下了一篇详细的博客文章(附有图片和粗俗的评论!)。如果需要,请单击链接:

http://www.calvinfroedge.com/salesforce-how-to-generate-api-credentials/

这是一个纯文本的答案:

步骤1:

创建一个帐户。您可以在 developer.salesforce.com 创建一个(免费)开发者帐户


第2步:

忽略所有登陆页面并开始使用废话。这是一个无止境的营销循环。


第 3 步:

点击“设置”链接


第4步:

在左侧工具栏中的“创建”下,单击“应用程序”


第 5 步:

在“连接的应用程序”下单击“新建”


第 6 步:

填写表格。重要字段是标记为必填的字段和 oauth 部分。请注意,您可以为回调留下任何 url(我使用 localhost)。


第 7 步:

请注意,Salesforce 的可用性很差。


第 8 步:

按继续。你终于有了你的 client_id 密钥(标记为“Consumer Key”)和 client_secret(标记为“Consumer Secret”)。


第 9 步:

可是等等!你还没有完成;选择“管理”,然后选择“编辑策略”

  1. 确保将IP 放宽设置为放宽 IP 限制

  2. 并确保允许的用户设置为“所有用户都可以自我授权”,

  3. 并确保您的安全 > 网络访问 > 受信任的 IP 范围已设置

OAuth 设置

安全 > 网络访问 > 可信 IP 范围

如果您担心禁用安全性,请暂时不要这样做,您只想让此功能暂时正常工作,以便进行 API 调用。一旦一切正常,一次一个地收紧权限,这样您就可以弄清楚是什么设置给了您身份验证错误。


第 10 步:

庆祝!这个 curl 调用应该成功:

生产:_

curl -v https://login.salesforce.com/services/oauth2/token \
  -d "grant_type=password" \
  -d "client_id=YOUR_CLIENT_ID_FROM_STEP_8" \
  -d "client_secret=YOUR_CLIENT_SECRET_FROM_STEP_8" \
  -d "username=user@wherever.com" -d "password=foo@bar.com"

沙箱测试上:

curl -v https://test.salesforce.com/services/oauth2/token \
  -d "grant_type=password" \
  -d "client_id=YOUR_CLIENT_ID_FROM_STEP_8" \
  -d "client_secret=YOUR_CLIENT_SECRET_FROM_STEP_8" \
  -d "username=user@wherever.com" -d "password=foo@bar.com"

笔记:

  • 如果您正在构建一个多租户应用程序,那么您不应该进行密码授权,用户需要授权他们自己的应用程序。为此,请使用 Oauth2 工作流程。

  • 您可能需要传递附加到密码的安全令牌。

于 2015-03-18T00:38:23.267 回答
14

我们也有这个问题。

检查您的Connected App设置 - 在 下Selected OAuth Scopes,您可能需要调整所选权限。我们的应用主要使用Chatter,所以我们必须同时添加:

  • 访问和管理您的 Chatter 摘要 ( chatter_api)
  • 随时代表您执行请求 ( refresh_token)。

同样,您的里程可能会有所不同,但会根据您的应用程序所做/需要的内容尝试不同的权限组合。

此外,实际invalid_grant错误似乎是由于IP 限制而发生的。确保允许运行 OAuth 身份验证代码的服务器 IP 地址。我发现如果 SFDC 环境设置了 IP 限制设置Enforce IP restrictions( Setup-> Administer-> Manage Apps->Connected Apps ),那么每个用户配置文件也必须具有允许的 IP 地址。

于 2013-09-30T21:52:59.953 回答
10

TL:博士

对于 OAuth 2 令牌,如果您登录...

故事:

  1. 我正在关注Salesforce“设置 OAuth 2.0”
  2. 凭据是正确的(许多字符逐字符检查)
  3. 当我调用curl https://login.salesforce.com/services/oauth2/token -d "...credentials..."它时仍然失败:

    {"error":"invalid_grant","error_description":"authentication failure"}

解决方案:

在阅读Digging Deeper into OAuth 2.0 in Salesforce时,意识到有不同的 OAuth 环境(强调添加):

OAuth 2.0 身份验证端点

OAuth 端点是您用来向 Salesforce 发出 OAuth 身份验证请求的 URL。当您的应用程序发出身份验证请求时,请确保您使用的是正确的 Salesforce OAuth 端点。主要终点是:

  • 授权—<a href="https://login.salesforce.com/services/oauth2/authorize" rel="noreferrer">https://login.salesforce.com/services/oauth2/authorize
  • 令牌—<a href="https://login.salesforce.com/services/oauth2/token" rel="noreferrer">https://login.salesforce.com/services/oauth2/token
  • 撤销—<a href="https://login.salesforce.com/services/oauth2/revoke" rel="noreferrer">https://login.salesforce.com/services/oauth2/revoke(请参阅撤销 OAuth 令牌以了解撤销访问的详细信息)

除了login.salesforce.com,客户还可以在这些端点中使用My Domaincommunitytest.salesforce.com(沙盒)域。

使固定

test.salesforce.com因为我通过切换登录到我的环境curl https://test.salesforce.com/services/oauth2/token -d "...credentials..."导致“恭喜!(>^_^)> 提供 OAuth 令牌响应”

于 2018-04-18T18:40:04.340 回答
7

要将 IP 地址范围列入白名单,请执行以下步骤:

  1. 点击Setup右上角的
  2. 从左侧导航中选择Administer> Security Controls>Network Access
  3. 点击New
  4. 添加您的 IP 地址范围
  5. 点击Save
于 2016-01-05T21:11:32.217 回答
7

Salesforce 要求在 2017 年 7 月 22 日之前升级到 TLS 1.1 或更高版本,以符合安全和数据完整性的行业最佳实践: 来自 help.salesforce.com

尝试添加此代码:

System.Net.ServicePointManager.SecurityProtocol = 
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

另一种选择是编辑您的注册表:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

检查此链接以获得更详细的答案: Default SecurityProtocol in .NET 4.5

于 2017-04-06T12:34:47.810 回答
6

将您的 Salesforce 密码替换为密码和安全令牌的组合。例如,如果您的密码是“MyPassword”并且您的安全令牌是“XXXXXX”,则您需要在密码字段中输入“MyPasswordXXXXXX”。

如果您没有安全令牌,您可以如下重置它。

  • 转到您的姓名 --> 我的设置 --> 个人 --> 重置我的安全令牌。
于 2018-07-10T07:30:55.123 回答
3

如果您在访问令牌设置中输入消费者密钥和消费者秘密,您可以使用Postman调用您的 APEX 控制器- 您不需要安全令牌。

像这个截图一样设置授权......

邮递员 OAuth 2.0

并在点击 Get New Access Token 按钮后在窗口中输入您的凭据...

获取访问令牌

然后点击 Request Token 按钮生成一个令牌,然后点击 Use Token 按钮,它将填充 Authorization 选项卡上的 Access Token 字段,您点击 Get New Access Token 按钮。

于 2019-01-29T11:31:54.987 回答
1

我正用头撞桌子,试图让它发挥作用。原来我的问题是复制和粘贴,这弄乱了“字符。我去手动输入”将其粘贴到命令行中,然后它就起作用了。

于 2019-02-23T16:31:50.790 回答
1

我在所有键设置正确时都遇到了同样的错误,并且花了很多时间试图找出我无法连接的原因。

最后我发现在Setup -> Manage Connected Apps -> Click "MyAppName" -> Click "Edit Policies"

在“允许的用户”字段值中,应设置“所有用户都可以自我授权”。

于 2019-08-05T14:48:43.340 回答
1

确保您的密码中包含字母数字字符。

于 2020-08-04T16:42:56.753 回答
0

除了遵循上述建议之外,我发现 Salesforce 不喜欢axios将数据编码为 JSON 的方式。我从默认的 JSON 编码切换到使用qs字符串化和发布为表单数据,并且工作正常。仍然不确定为什么Salesforce 不喜欢 JSON 版本,如果有人有更好的想法,我很想了解更多。

这有效:

axios.post(
  url,
  qs.stringify({
    grant_type: "password",
    username: process.env.USERNAME,
    password: process.env.PASSWORD,
    client_id: process.env.SF_ID,
    client_secret: process.env.SF_SECRET,
  }),
  { headers: "Content-Type": "application/x-www-form-urlencoded", },
)

这没有:

axios.post(
  url,
  {
    grant_type: "password",
    username: process.env.SF_USERNAME,
    password: process.env.SF_PASSWORD,
    client_id: process.env.SF_ID,
    client_secret: process.env.SF_SECRET,
   }
);
于 2021-04-20T17:48:52.633 回答
0

我遇到了这个问题,在尝试了几个失败的教程后,我发现一篇文章说 Salesforce 不会接受其中包含特殊字符(!、@、#)的密码。我在 Salesforce 中将我的密码更改为没有特殊字符的密码,终于让它工作了。

于 2021-08-21T14:52:41.683 回答
-1

我尝试了许多以上对我不起作用的解决方案。然而,实际上对我有用的技巧是停止使用 curl 并使用邮递员应用程序来发出请求。

通过在邮递员中复制请求,使用 POST 请求和以下参数

  1. 授予类型
  2. client_id
  3. client_secret
  4. 用户名
  5. 密码

这为我解决了这个问题。

只是将其发布在这里,以防其他人尝试了所有可能的解决方案但无济于事(就像我一样)。

于 2019-07-10T17:26:24.530 回答