Salesforce身份验证失败

时间:2012-10-09 06:48:05

标签: salesforce oauth-2.0 force.com

我正在尝试使用OAuth身份验证来获取Salesforce身份验证令牌,因此我提到了wiki docs,但在获得授权代码后,当我发出包含5个必需参数的Post请求时,我遇到了异常< / p>

{"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());

如果有例外,请回复吗?

13 个答案:

答案 0 :(得分:127)

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

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. 并确保您的安全&gt;网络访问&gt;已设置受信任的IP范围

  4. OAuth settings

    Security > Network Access > Trusted IP Ranges

    如果你担心禁用安全性,不要现在,你只是想让它现在正常工作,这样你就可以进行API调用。一旦一切正常工作,一次一个地加强权限,这样你就可以弄清楚哪些设置会给你带来身份验证错误。


    第10步:

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

    生产:

    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"
    

    on sandbox 或 test

    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工作流程。

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

答案 1 :(得分:12)

我们也有这个问题。

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

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

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

此外,由于 IP限制,似乎发生了实际的 invalid_grant 错误。确保允许运行OAuth身份验证代码的服务器的IP地址。我发现如果SFDC环境有IP限制设置强制IP限制设置( 设置 - &gt; 管理 - &gt; 管理应用 - &gt; 已连接的应用 ),然后每个用户配置文件也必须具有允许的IP地址。

答案 2 :(得分: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

答案 3 :(得分:4)

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"}

  4. 解决方案:

    在专门阅读Digging Deeper into OAuth 2.0 in Salesforce时已经实现了不同的OAuth环境(强调添加):

      

    OAuth 2.0身份验证终结点

         

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

               

    除了 login.salesforce.com ,客户还可以使用 我的域 这些端点中的社区 test.salesforce.com (沙盒)域。

    修复

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

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

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

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

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

答案 6 :(得分:1)

确保您的密码<仅> em 中包含字母数字字符。

答案 7 :(得分:0)

如果您在访问令牌设置中输入了使用者密钥和使用者密钥,则可以使用Postman来呼叫APEX控制器-您不需要为此使用安全令牌。

像这样的屏幕截图设置授权...

Postman OAuth 2.0

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

Get Access Token

然后单击“请求令牌”按钮以生成令牌,然后单击“使用令牌”按钮,它将填充“授权”选项卡上的“访问令牌”字段,在其中单击“获取新的访问令牌”按钮。

答案 8 :(得分:0)

我正在把头撞在桌子上,试图使它起作用。原来我的问题是复制和粘贴,弄乱了“字符。我去手动键入”将其粘贴到命令行中,然后就可以了。

答案 9 :(得分:0)

在所有键设置正确的情况下,我也遇到了同样的错误,并花了很多时间试图弄清为什么我无法连接。

最后,我发现在设置->管理连接的应用程序->单击“ MyAppName”->单击“编辑策略”

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

答案 10 :(得分: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,
   }
);

答案 11 :(得分:-1)

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

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

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

这为我解决了这个问题。

只要在这里发布它,以防万一其他人尝试了所有可能的解决方案而没有用(像我一样)。

答案 12 :(得分:-3)

我正在使用具有以下请求格式的salesforce soap api

<?xml version="1.0" encoding="utf-8" ?>
        <env:Envelope
                xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"
                xmlns:urn="urn:partner.soap.sforce.com">
            <env:Header>
                <urn:CallOptions>
                    <urn:client>client_id</urn:client>
                    <urn:defaultNamespace>sf</urn:defaultNamespace>
                </urn:CallOptions>
            </env:Header>
            <env:Body>
                <n1:login xmlns:n1="urn:partner.soap.sforce.com">
                    <n1:username>username</n1:username>
                    <n1:password>password+security_token</n1:password>
                </n1:login>
            </env:Body>
        </env:Envelope>

我已成功登录,但应用程序未显示为我的设置。 当我尝试使用这种方法时,它正在工作。

  

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”

任何人都可以告诉我我做错了什么或者salesforce soap api不支持这个吗?