Salesforce身份验证失败

Salesforce身份验证失败,salesforce,oauth-2.0,force.com,Salesforce,Oauth 2.0,Force.com,我试图使用OAuth身份验证来获取Salesforce身份验证令牌,所以我提到了,但是在获得授权代码之后,当我使用5个必需参数发出Post请求时,我得到了以下异常 {"error":"invalid_grant","error_description":"authentication failure"} CODE 400 JSON = {"error":"invalid_grant","error_description":"authentication failure"} 我想这是个错误的要

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

如果知道例外情况,请回复?

我们也有这个问题

检查连接的应用程序设置-在选定的OAuth范围下,您可能需要调整选定的权限。我们的应用程序主要使用Chatter,因此我们必须同时添加这两个功能:

  • 访问和管理Chatter提要(
    Chatter\u api
  • 随时代表您执行请求(
    refresh\u token
同样,您的里程数可能会有所不同,但请根据应用程序的用途/需要尝试不同的权限组合


此外,实际的
无效\u授权
错误似乎是由于IP限制而发生的。确保允许运行OAuth身份验证代码的服务器IP地址。我发现,如果SFDC环境具有IP限制设置强制设置IP限制(设置->管理->管理应用->连接的应用),那么每个用户配置文件也必须具有允许的IP地址。

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

以下是一个纯文本的答案:

步骤1:

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


步骤2:

忽略所有的登录页和入门废话。这是一个无休止的营销循环


步骤3:

单击“设置”链接


步骤4:

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


步骤5:

在“已连接的应用”下,单击“新建”


步骤6:

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


步骤7:

请注意,Salesforce的可用性很差


步骤8:

按continue。您终于有了客户端id密钥(标记为“消费者密钥”)和客户端密钥(标记为“消费者密钥”)


步骤9:

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

  • 确保IP放松设置为放松IP限制

  • 并确保允许用户设置为“所有用户都可以自行授权”

  • 此外,还要确保您的安全>网络访问>受信任的IP范围已设置

  • 如果您担心禁用安全性,暂时不要担心,您只想让它暂时起作用,这样您就可以进行API调用。一旦一切正常,请收紧权限,一次一个,这样您就可以确定是什么设置给了您身份验证错误


    步骤10:

    庆祝!此curl呼叫应成功:

    在生产方面:

    在沙箱或测试中:

    注意事项:

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

    • 您可能需要传入附加在密码后的安全令牌


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

  • 单击右上角的
    Setup
  • 从左侧导航栏中选择
    管理
    安全控制
    网络访问
  • 单击
    New
  • 添加您的ip地址范围
  • 单击
    保存

  • Salesforce要求在2017年7月22日之前升级到TLS 1.1或更高版本,以符合安全性和数据完整性方面的行业最佳做法:

    尝试添加以下代码:

    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
    
    查看此链接以获取更详细的答案:

    TL:DR 对于OAuth 2令牌,如果您登录

    • login.salesforce.com
      使用
    • test.salesforce.com
      使用
    故事:
  • 我在跟踪
  • 凭据正确(多次逐字符检查)
  • 当我调用
    curl时https://login.salesforce.com/services/oauth2/token -d“…凭据…”
    仍然失败,原因是:

    {“错误”:“授权无效”,“错误描述”:“身份验证失败”}

  • 解决方案: 具体阅读时意识到有不同的OAuth环境(重点补充):

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

    • 授权书-
    • 代币-
    • 撤销-(有关撤销访问的详细信息,请参阅撤销OAuth令牌)
    客户也可以在这些端点中使用我的域社区test.salesforce.com(沙盒)域,而不是login.salesforce.com

    修理
    因为我通过
    test.salesforce.com
    切换到
    curl登录了我的环境https://test.salesforce.com/services/oauth2/token -d“…凭证…”
    导致了一个“”祝贺!(>^^^)>给出OAuth令牌响应”

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

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

    • 转到您的姓名-->我的设置-->
      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
      
      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,
         }
      );