Salesforce身份验证失败

问题描述 投票:46回答:9

我正在尝试使用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 oauth-2.0 force.com
9个回答
126
投票

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

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范围

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 "[email protected]" -d "[email protected]"

在沙箱或测试:

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工作流程。
  • 您可能需要传入附加到密码的安全令牌。

12
投票

我们也有这个问题。

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

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

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

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


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


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

解:

实现了在特别阅读Digging Deeper into OAuth 2.0 in Salesforce时有不同的OAuth环境(强调添加):

OAuth 2.0 Authentication Endpoints

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

客户还可以在这些端点中使用My Domain,社区或test.salesforce.com(沙箱)域,而不是login.salesforce.com。

固定

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


3
投票

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

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

2
投票

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

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

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

0
投票

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

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

Postman OAuth 2.0

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

Get Access Token

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


0
投票

我正撞着桌子试图让这个工作起来。原来我的问题是复制和粘贴,这搞砸了“角色。我去手动输入”粘贴到命令行然后它工作。


-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“[email protected]”-d“[email protected]

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

© www.soinside.com 2019 - 2024. All rights reserved.