关于oauth 2.0:Salesforce身份验证失败

Salesforce Authentication Failing

我正试图使用OAuth身份验证来获取Salesforce身份验证令牌,因此我引用了wiki文档,但在获得授权代码后,当我使用5个必需参数发出POST请求时,我遇到以下异常

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

我想这是个不好的要求。

1
2
3
4
5
6
7
8
9
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());

如有例外,请回复。


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

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:

按继续。您最终拥有客户机的ID密钥(标记为"客户机密钥")和客户机的密钥(标记为"客户机密钥")。


步骤9:

但是等等!尚未完成;请选择"管理",然后选择"编辑策略"

  • 确保将IP放宽设置为放宽IP限制,

  • 并确保允许的用户设置为"所有用户都可以自行授权。",

  • 并确保您的安全>网络访问>可信IP范围已设置

  • OAuth settings

    Security >网络访问>可信IP范围

    如果您关心的是禁用安全性,现在不要这样做,您只需要现在就可以让它正常工作,这样您就可以进行API调用。一旦所有内容都正常工作(一次一个),就要加强权限,这样您就可以确定是什么设置导致了身份验证错误。


    步骤10:

    庆祝一下!此curl调用应成功:

    关于生产:

    1
    2
    3
    4
    5
    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"[email protected]" -d"[email protected]"

    沙盒或测试:

    1
    2
    3
    4
    5
    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"[email protected]" -d"[email protected]"

    笔记:

    • 如果您正在构建一个多租户应用程序,而用户需要在该应用程序中授权自己的应用程序,则不应该进行密码授权。为此使用OAuth2工作流。

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


    我们也有这个问题。

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

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

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

    此外,实际的invalid_grant错误似乎是由于IP限制而发生的。确保允许运行OAuth身份验证代码的服务器IP地址。我发现,如果sfdc环境的IP限制设置为enforce IP restrictions set(setupkbd->administr->manage appsakbd->connected appsakbd),那么每个用户配置文件也必须具有允许的IP地址。


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

    尝试添加此代码:

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

    另一个选项是编辑注册表:

    1
    2
    3
    4
    5
    [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

    请检查此链接以获取更详细的答案:.NET 4.5中的默认安全协议


    TL:DR

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

    • login.salesforce.com使用https://login.salesforce.com/services/oauth2/token
    • test.salesforce.com使用https://test.salesforce.com/services/oauth2/token

    Story:

  • 我在跟踪Salesforce"设置OAuth 2.0"
  • 凭证正确(多个字符逐个字符检查)
  • 当我打电话给curl https://login.salesforce.com/services/oauth2/token -d"...credentials..."时,它仍然失败,因为:

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

  • 解决方案:

    认识到在Salesforce中深入了解OAuth 2.0时,存在不同的OAuth环境(重点增加):

    OAuth 2.0 Authentication Endpoints

    OAuth endpoints are the URLs that you use to make OAuth authentication requests to Salesforce. When your application makes an authentication request, make sure you’re using the correct Salesforce OAuth endpoint. The primary endpoints are:

    • Authorization—https://login.salesforce.com/services/oauth2/authorize
    • Token—https://login.salesforce.com/services/oauth2/token
    • Revoke—https://login.salesforce.com/services/oauth2/revoke (see Revoke OAuth Tokens for details on revoking access)

    Instead of login.salesforce.com, customers can also use the My Domain, community, or test.salesforce.com (sandbox) domains in these endpoints.

    固定

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


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

  • 单击右上角的EDOCX1[3]
  • 从左侧导航中选择Administer>Security Controls>Network Access
  • 点击New
  • 添加您的IP地址范围
  • 点击Save

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

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

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


    我正把头撞在桌子上,想把它弄好。结果发现我的问题是复制和粘贴,这把"角色"搞乱了。我去手动输入"粘贴到命令行中,然后它就工作了。


    如果您在访问令牌设置中输入使用者密钥和使用者机密,则可以使用邮递员调用Apex控制器-您不需要为此使用安全令牌。

    像这样设置授权屏幕截图…

    邮差OAuth 2.0

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

    获取访问令牌

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


    我使用的是具有以下请求格式的Salesforce SOAP API

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?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
    "[email protected]" -d"[email protected]"

    有人能告诉我我做错了什么吗?或者Salesforce SOAP API不支持这一点?