【问题标题】:Salesforce Authentication FailingSalesforce 身份验证失败
【发布时间】:2012-09-29 10:42:28
【问题描述】:

我正在尝试使用 OAuth 身份验证来获取 Salesforce 身份验证令牌,所以我引用了wiki docs,但是在获得授权代码后,当我使用 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());

如果已知异常,请回复?

【问题讨论】:

  • 您找到解决方案了吗?我也面临同样的问题。
  • Salesforce 仅允许我们使用有效的电子邮件域,即不允许 yopmail.com、mailinator.com 等测试域。是允许的。
  • 你是怎么得到代码的
  • 检查您的 IP 范围。然后转到您的姓名 --> 我的设置 --> 个人 --> 重置我的安全令牌。您必须将该令牌附加到密码,例如:密码+令牌。试试看!

标签: salesforce oauth-2.0 force.com


【解决方案1】:

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

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. 并确保 Permitted Users 设置为“所有用户都可以自行授权”,

  3. 并确保您的安全 > 网络访问 > 受信任的 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 工作流程。

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

【讨论】:

  • 哇...非常感谢...第 9 步简直太棒了,让我摆脱了困境
  • 在使用 OAuth 登录时,我们是否需要通过密码传递安全令牌?我收到同样的错误invalid_grant
  • 很棒的指南,几乎对我有用。我遇到的问题是第 10 步中使用的 url 不起作用,因为我们有一个子域。 .my.saleforce.com。希望没有其他人在这方面浪费时间。
  • 我的问题毕竟是您的密码不能包含某些特殊字符! wtg sf!
  • 非常感谢,每次需要查找该页面时,我都会返回此过程。无法相信驾驭销售队伍有多么困难。
【解决方案2】:

我们也遇到过这个问题。

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

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

同样,您的工作量可能会有所不同,但请根据您的应用程序的用途/需要尝试不同的权限组合。

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

【讨论】:

  • 谢谢...我遇到了同样的问题。应用程序的默认设置是“强制 IP 限制”,因此您需要在设置 -> 管理 -> 管理应用程序 -> 连接的应用程序...中放松这一点。
【解决方案3】:

TL:DR

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

故事:

  1. 我关注了Salesforce "Set Up 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 端点。主要终点是:

除了 login.salesforce.com,客户还可以使用 My Domain community,或这些端点中的 test.salesforce.com(沙盒)域。

修复

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

【讨论】:

    【解决方案4】:

    要将 IP 地址范围列入白名单,请按以下步骤操作:

    1. 点击右上角的Setup
    2. 从左侧导航中选择Administer > Security Controls > Network Access
    3. 点击New
    4. 添加您的 IP 地址范围
    5. 点击Save

    【讨论】:

      【解决方案5】:

      Salesforce 要求在 2017 年 7 月 22 日之前升级到 TLS 1.1 或更高版本,以符合安全和数据完整性的行业最佳实践: from 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

      【讨论】:

      【解决方案6】:

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

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

      • 转到您的姓名 --> 我的设置 --> 个人 --> 重置我的安全令牌。

      【讨论】:

      • 这对我有帮助。
      • 像魅力一样工作。谢谢@Satish
      【解决方案7】:

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

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

      Postman OAuth 2.0

      点击获取新访问令牌按钮后,在窗口中输入您的凭据...

      Get Access Token

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

      【讨论】:

      • 欢迎来到Stackoverflow,如果有步骤或代码sn-p,详细解释你的答案,方便大家理解。
      • 更新了原始帖子,包含更多说明和另一个屏幕截图
      • 非常感谢您发布有关使用 Postman 检索访问令牌的说明。不幸的是,Salesforce“REST API 开发人员指南”中的“快速入门”说明在配置 Salesforce 和检索其所有 CURL 命令所需的访问令牌时并非毫无价值(授权:Bearer ) .
      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

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

        最后我发现在Setup -> Manage Connected Apps -> 点击“MyAppName” -> 点击“Edit Policies”

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

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

            除了遵循上述建议之外,我发现 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,
               }
            );
            

            【讨论】:

              【解决方案12】:

              我遇到了这个问题,在尝试了几次失败的教程后,我发现一篇帖子说 Salesforce 不接受包含特殊字符(!、@、#)的密码。我将 Salesforce 中的密码更改为没有特殊字符的密码,终于可以使用了。

              【讨论】:

                【解决方案13】:

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

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

                1. grant_type
                2. client_id
                3. client_secret
                4. 用户名
                5. 密码

                这解决了我的问题。

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

                【讨论】:

                  猜你喜欢
                  • 2014-01-24
                  • 1970-01-01
                  • 2017-11-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2022-01-11
                  • 2014-05-23
                  相关资源
                  最近更新 更多