Salesforce身份验证失败


72

我正在尝试使用OAuth身份验证来获取Salesforce身份验证令牌,因此我引用了wiki文档,但是在获取授权代码后,当我发出带有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());

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


找到解决方案了吗?我也面临着同样的问题。
Govind Malviya 2013年

Salesforce仅允许我们使用有效的电子邮件域,即不允许使用yopmail.com,mailinator.com等测试域。
Vardan Gupta

您如何获取代码

检查您的IP范围。然后转到您的姓名->我的设置->个人->重置我的安全令牌。您必须将该令牌附加到密码上,例如:password + token。尝试!
阮胜

Answers:


185

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

http://www.calvinfroedge.com/salesforce-how-to-generate-api-credentials/

这是纯文字答案:

第1步:

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


第2步:

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


第三步:

点击“设置”链接


步骤4:

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


步骤5:

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


步骤6:

填写表格。重要字段是标记为必填字段和oauth部分。请注意,您可以为回调保留任何URL(我使用localhost)。


步骤7:

请注意,Salesforce的可用性很差。


步骤8:

按继续。您终于有了client_id密钥(标记为“ Consumer Key”)和client_secret(标记为“ Consumer Secret”)。


步骤9:

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

  1. 确保将IP放松设置为放松IP限制

  2. 并确保将“允许的用户”设置为“所有用户都可以自我授权”,

  3. 并确保已设置“安全性”>“网络访问”>“可信IP范围”

OAuth设置

安全性>网络访问>可信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工作流程。

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


10
哇...非常感谢...第9步简直
太棒

6
使用OAuth登录时是否需要通过密码传递安全令牌?我遇到了同样的错误invalid_grant
Dory 2015年

2
很好的指南,它几乎对我有用。我遇到的问题是,在步骤10中使用的url无效,因为我们有一个子域。<my_domain> .my.saleforce.com。希望没有其他人会为此浪费时间。
Mikael Svensson

6
我的问题毕竟是您的密码不能包含某些特殊字符!wtg sf!
john.stein,2013年

4
非常感谢,每次需要查找该页面时,我都会继续返回此过程。无法相信导航销售人员有多么困难。
newdark-it

14

我们也有这个问题。

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

  • 访问和管理您的Chatter供稿(chatter_api
  • 随时可以代表您执行请求(refresh_token)。

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

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


3
谢谢...我有同样的问题。应用程序的默认设置为“强制IP限制”,因此您确实需要在设置->管理->管理应用程序->连接的应用程序...中放宽此设置。
dacology 2014年

9

TL:DR

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

故事:

  1. 我正在关注Salesforce“设置OAuth 2.0”
  2. 凭据正确(许多字符逐字符检查)
  3. 当我打电话给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身份验证端点

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

  • 授权-https ://login.salesforce.com/services/oauth2/authorize
  • 令牌-https : //login.salesforce.com/services/oauth2/token
  • 撤销-https : //login.salesforce.com/services/oauth2/revoke (有关撤销访问的详细信息,请参阅“撤销OAuth令牌”)

取而代之的login.salesforce.com,客户还可以使用我的网域社区,或test.salesforce.com在这些端点(沙盒)域。

固定

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


7

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

检查此链接以获得更多详细的答案: .NET 4.5中的默认SecurityProtocol


Salesforce OAuth提供商的相关github问题github.com/TerribleDev/OwinOAuthProviders/issues/177
Ben Wilde

5

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

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

4

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

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

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

3

如果在“访问令牌”设置中输入“使用者密钥”和“使用者秘密”,则可以使用“邮递员”来呼叫APEX控制器-不需要安全令牌。

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

邮递员OAuth 2.0

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

获取访问令牌

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


1
欢迎使用Stackoverflow,使用步骤或代码段(如果有的话)详细说明您的答案,以便对所有人有所帮助。
SIVA桑卡尔

更新了原始帖子,并提供了进一步的说明和其他屏幕截图
Kevin

1
非常感谢您发布有关使用Postman检索访问令牌的说明。遗憾的是,在配置Salesforce并检索其所有CURL命令所需的访问令牌时,《 Salesforce“ REST API开发人员指南》中的“快速入门”说明一文不值(授权:Bearer <访问令牌>) 。
jerhewet

1

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


1

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

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

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


1

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


-1

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

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

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

这为我解决了这个问题。

如果有其他人尝试了所有可能的解决方案而无济于事(就像我一样),请在此处发布。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.