Salesforce认证失败

88
我正在尝试使用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());

请回复,是否已知异常?


你找到解决方案了吗?我也遇到了同样的问题。 - Govind Malviya
Salesforce只允许我们使用有效的电子邮件域名,例如不允许使用像yopmail.com、mailinator.com等测试域名。 - Vardan Gupta
你是怎么得到这份代码的? - user2493476
检查您的IP范围。然后转到您的名称-->我的设置-->个人-->重置我的安全令牌。您必须将该令牌附加到密码中,例如:password+token。试试看! - Nguyễn Thắng
13个回答

223

如果有人和我一样被卡住和沮丧,我已经在整个过程中留下了一篇详细的博客文章(包括图片和评论!)。 如果您需要,请单击链接:

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

以下是纯文本答案:

步骤 1:

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


步骤 2:

忽略所有着陆页面和入门流程。 这是一个无休止的营销循环。


步骤 3:

单击“设置”链接


步骤 4:

在左侧工具栏下面的"Create"下面,点击“应用程序”


步骤 5:

在“连接的应用程序”下点击“新建”


步骤 6:

填写表格。 重要字段是标记为必填项的字段和oauth部分。 请注意,您可以将回调的任何URL留空(我使用本地主机)。


步骤 7:

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


步骤 8:

单击继续。 您最终拥有客户端ID密钥(标记为“Consumer Key”)和客户端秘密(标记为“Consumer Secret”)。


步骤 9:

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

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

  2. 并确保Permitted Users设置为“All users may self-authorize.”,

  3. 还要确保您的Security > Network Access > Trusted IP Ranges已设定

OAuth settings

Security > Network Access > Trusted IP Ranges

如果您担心禁用安全性,请暂时不要担心,现在只是想让其工作,以便您可以进行API调用。 一次只加强一个设置的权限,以便您可以确定哪个设置给您提供身份验证错误。


步骤 10:

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

对于production

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

  • 您可能需要将安全令牌附加到密码后面进行传递。


15
哇...非常感谢...第九步棒极了,让我摆脱了困境。 - Azeez
7
在使用OAuth登录时,我们需要通过安全令牌和密码吗?我一直收到同样的错误“invalid_grant”。 - Dory
7
我的问题是,在所有这些之后,你的密码不能包含某些特殊字符!真是干得好! - john.stein
4
非常感谢,每次我需要找到那个页面时,都会回到这个流程。简直不敢相信Salesforce导航有多么困难。 - User128848244
4
博客似乎已经废弃 - 存档副本在这里 https://web.archive.org/web/20181226011555/http://www.calvinfroedge.com/salesforce-how-to-generate-api-credentials/ - CupawnTae
显示剩余14条评论

14

我们也遇到了这个问题。

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

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

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

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


3
谢谢...我遇到了同样的问题。应用程序的默认设置是“强制IP限制”,因此您需要在“设置”->“管理员”->“管理应用程序”->“已连接的应用程序”中放宽限制,就像上面所述的那样。 - dacology

13

简述:

如果您登录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端点。主要端点包括:

  • Revoke—https://login.salesforce.com/services/oauth2/revoke(有关吊销访问的详细信息,请参见撤销OAuth令牌)
  • 除了login.salesforce.com,客户还可以在这些端点中使用My Domaincommunitytest.salesforce.com(沙盒)域。

    修复

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


    7

    要将IP地址范围添加到白名单,请按照以下步骤进行操作:

    1. 在右上角点击 设置
    2. 从左侧导航中选择 管理 > 安全控制 > 网络访问
    3. 点击 新建
    4. 添加您的IP地址范围
    5. 点击 保存

    7
    Salesforce要求在2017年7月22日之前升级到TLS 1.1或更高版本,以符合安全和数据完整性的行业最佳实践。具体信息请参见help.salesforce.com链接:https://help.salesforce.com/articleView?id=000221207&type=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
    

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


    销售人员的OAuth提供程序相关的Github问题 https://github.com/TerribleDev/OwinOAuthProviders/issues/177 - Ben Wilde

    6

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

    如果您没有安全令牌,则可以按照以下步骤进行重置。

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

    这帮助了我。 - Allen Gingrich

    3

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

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

    Postman OAuth 2.0

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

    Get Access Token

    然后点击“请求令牌”按钮生成一个令牌,再点击“使用令牌”按钮,它将填充授权选项卡上的访问令牌字段,您在此处点击“获取新访问令牌”按钮。


    1
    欢迎来到Stackoverflow!请详细解释您的答案,并提供步骤或代码片段,以便让每个人都能理解。 - Şivā SankĂr
    已更新原帖并附上进一步的说明和另一张截图。 - Kevin
    1
    我无法感谢你足够多地发布了有关使用Postman检索访问令牌的说明。 Salesforce“REST API开发人员指南”中的“快速入门”说明在配置Salesforce和检索所需的所有CURL命令(Authorization:Bearer <the Access Token>)的访问令牌方面不幸地毫无价值。 - jerhewet

    1
    我曾经为让这个工作正常而苦思冥想,结果发现问题出在复制和粘贴上,这搞乱了“字符。然后我手动输入了“字符并将其粘贴到命令行中,然后它就正常工作了。

    1
    我曾经遇到同样的错误,所有密钥都设置正确,花了很多时间试图弄清楚为什么我无法连接。
    最终,我发现在 设置 -> 管理连接的应用程序 -> 点击 "MyAppName" -> 点击 "编辑策略" 中。
    '允许用户'字段值应该设置为"All users may self-authorize"。

    1

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


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接