【问题标题】:Python Simple SalesforcePython 简单的 Salesforce
【发布时间】:2014-08-05 02:23:09
【问题描述】:

我正在尝试使用simple_salesforce 通过 Python 查询销售人员数据。我正在使用我的用户名和密码,我 100% 确定它是正确的。我通过登录 Salesforce 并查看我的公司资料获得了组织 ID。这只是一个 15 位数的 ID。我专门使用 orgID 来避免使用安全令牌,因为我不知道它是什么。我做错了什么?

代码:

from simple_salesforce import Salesforce
sf = Salesforce(instance_url='https://na1.salesforce.com', session_id='')
sf = Salesforce(password='password', username='email', organizationId='15 digit org id')

输出:

File "C:\Python27\lib\site-packages\simple_salesforce\api.py", line 100, in __init__
proxies=self.proxies)
File "C:\Python27\lib\site-packages\simple_salesforce\login.py", line 124, in SalesforceLogin
code=except_code, message=except_msg))
simple_salesforce.login.SalesforceAuthenticationFailed: INVALID_LOGIN: Invalid username, password, security token; or user locked out.

【问题讨论】:

  • 您好,您的问题解决了吗?我仍然遇到同样的问题,我使用的是 security_token 而不是 organizationId。我已经通过邮件从salesforce 拿走了我的security_token。但是它仍然无法登录,并且控制台仍然向我显示与您相同的错误。这个有什么更新吗?
  • 是的,我做到了。我正在使用安全令牌,效果很好。如果您想发布带有特定代码和错误的问题。我可以看看。
  • 你能看看这个吗? stackoverflow.com/questions/38659806/…
  • 如果您启用了 IP 限制,您应该使用空字符串 '' 作为安全令牌。

标签: python python-2.7 soap salesforce simple-salesforce


【解决方案1】:

simple-salesforce 的大部分内容都是我写的(虽然不是organizationId 部分,因为我没有 IP 白名单帐户可供测试)

standard/vanilla/regular/99% 的用户应该使用的版本是简单的usernamepasswordsecurity_token 方法。

像这样的

from simple_salesforce import Salesforce
sf = Salesforce(username='nick@nickcatalano.com', password='nickspassword', security_token='tokenemailedtonick')

到目前为止,最令人困惑的部分是security_token 部分(也是我遇到的部分。)事实证明,安全令牌是在成功重置密码后通过电子邮件发送给您的。因此,如果您进入您的 Salesforce 帐户并重置密码,我相信您最终会收到一封主题为 salesforce.com security token confirmation 的电子邮件,其中将在电子邮件中包含 Security Token。那是你的security_token

说实话,security_token kwarg 比什么都方便。在大多数用户依赖于实际发送的正常email/password/token 流中,email 作为登录名,{password}{security_token} 作为密码。我相信你可以自己连接它,如果你愿意,只需传入 emailpassword kwarg,但我认为强迫人们自己连接密码和令牌会违背 simplesimple-salesforce 部分/p>

【讨论】:

【解决方案2】:

一种方法,只需使用用户名和密码即可使用 simple-salesforce 登录。不需要安全令牌:

from simple_salesforce import Salesforce, SalesforceLogin

session_id, instance = SalesforceLogin(username='<user>', password='<pass>')
sf = Salesforce(instance=instance, session_id=session_id)
# Logged in! Now perform API actions, SOQL queries, etc.
sf.query_all('<soql>')

说明

所有使用 simple-salesforce 的示例都以调用 Salesforce 构造函数以登录开始。此构造函数接受现有会话 ID 或身份验证凭据以登录并建立新会话。登录时,它调用较低级别的SalesforceLogin 函数来完成真正的工作,但有趣的是SalesforceLogin 并没有对其参数强制执行相同的约束——它发出正确的 SOAP 调用以仅使用用户名和密码登录,无需令牌或组织 ID。

使用这个技巧,我们直接调用SalesforceLogin,获取新的会话ID,然后将它直接传递给Salesforce构造函数。从那时起,我们就可以发出经过身份验证的 API 请求了。

注意

PyPI 上的 simple-salesforce 版本(即pip install simple-salesforce)与simple-salesforce GitHub 存储库相比非常过时。最新版本支持额外的登录参数,如domain,用于使用自定义域登录。要获取最新版本,请使用

pip install --upgrade https://github.com/simple-salesforce/simple-salesforce/archive/master.zip

(如this answer 所述,从 zip 安装 Pip 比使用 git+ssh://git+https:// 更快。)

【讨论】:

    【解决方案3】:

    编辑

    重置我的密码将如何显示令牌是什么?

    它会的。如果用户曾经请求过安全令牌(通过电子邮件发送给您 - 因此您需要访问与您的用户关联的电子邮件地址) - 每次后续密码重置都会生成新令牌并通过电子邮件发送给您。最重要的是,一旦您登录系统(登录到网络版本,而不是通过 API),您将可以选择重置您的令牌(同样,这会向您发送一封电子邮件)。

    就像你没有阅读或尝试过我们写的任何东西!

    从可靠和/或官方来源寻找答案。

    https://help.salesforce.com/htviewhelpdoc?id=user_security_token.htm

    https://help.salesforce.com/HTViewSolution?id=000004502

    https://help.salesforce.com/HTViewSolution?id=000003783

    并且来自图书馆的文档:

    https://github.com/neworganizing/simple-salesforce

    要使用 IP 白名单组织 ID 方法登录,只需使用您的 Salesforce 用户名、密码和组织 ID

    这个。如果您的 IP 地址被列入白名单 - 您不需要令牌。如果不是 - 您需要生成令牌。期间。


    原答案

    我不熟悉那个 Python 库,但是... 转到 Salesforce -> 设置 -> 我的个人信息并检查登录历史记录。如果它包含诸如“失败:需要安全令牌”之类的内容,那么您就完蛋了,您必须使用安全令牌。

    我不知道有任何使用 org id 的绕过(我已经通过 PHP、Java、C# 的 API 进行了连接......所以如果那个 Python 库有一些神奇的方法可以绕过它,我会感到非常惊讶。您可能习惯于传递假设您已经通过身份验证并拥有有效会话的会话 ID。

    另一个选项是检查您的 IP 并将其添加到受信任的 IP 范围(这是设置中的一个选项)。例如,当整个办公室具有相同的静态 IP 时,它很有用;如果您在家工作,则用处不大。

    如果这也不可行 - 您可能需要寻找使用 OAuth2 而不是常规 SOAP API 进行身份验证的库。

    【讨论】:

    • 我已阅读并尝试过您建议的内容。我没有登录历史记录的链接,我重置了密码并且没有收到来自 Salesforce 的电子邮件。我的问题特别是关于使用组织 ID 登录(请参阅我的问题和代码)。它不起作用,我正在寻求帮助。
    • Org id 对于通过 API 登录的目的是无用的。我不知道这个 Python 库用它做什么,也许是想弄清楚它应该是 login.salesforce.com 还是 test.salesforce.com。但是 SF API 不要求你通过它,所以它打败了我为什么那个 lib 的作者认为他需要它。如果您导航到用户的详细信息页面并检查相关列表(如果您的组织使用 Chatter,您需要查找“高级用户详细信息”) - 您真的看不到那里的登录历史记录吗?很奇怪。
    • 不,我没有。奇怪的。感谢您的跟进。
    • 您可以查看您的个人资料吗?您是使用标准系统管理员配置文件还是使用自定义配置文件? help.salesforce.com/HTViewHelpDoc?id=users_login_history.htm
    • 文档不是很好,有很多,所以很难找到你需要的。事物的命名不一致。例如,为什么 oauth 文档中的客户端 ID 命名为消费者密钥?
    【解决方案4】:

    虽然这有点晚了,但是对于我所做的事情,搜索这个问题的人可能会有所帮助。

    我也很难添加公司 ID,但这里的问题是,除非您是自助服务用户,否则公司 ID 可以为空。

    sf = Salesforce(password='password', username='email', organizationId='')
    

    正如其他用户所提到的,请确保您使用的是 IP 白名单,否则它将不起作用。

    【讨论】:

    • 天哪!即使我的沙箱中有组织 ID,我也必须传递空字符串。为什么?!?谢谢一百万;)
    • 太棒了!我尝试了各种各样的事情,这太可怕了,一个空字符串救了我!谢谢..
    【解决方案5】:

    安全令牌是自动生成的密钥,您必须将其添加到密码末尾,才能从不受信任的网络登录 Salesforce。例如,如果您的密码是 mypassword,而您的安全令牌是 XXXXXXXXXX,那么您必须输入 mypasswordXXXXXXXXXX 才能登录。无论您是通过 API 登录还是通过 Connect for Outlook、Connect Offline、Connect 等桌面客户端登录,都需要安全令牌Office、Connect for Lotus Notes 或 Data Loader。

    重置您的安全令牌:

    • 在任何 Salesforce 页面的顶部,单击您的姓名旁边的向下箭头。从您的姓名下的菜单中,选择设置或我的设置 - 以出现的为准。
    • 从左侧窗格中,选择以下选项之一:
      • 如果您单击设置,请选择我的个人信息 |重置我的安全令牌。
      • 如果您单击了我的设置,请选择个人 |重置我的安全令牌。
    • 单击重置安全令牌按钮。新的安全令牌将通过电子邮件发送到您的 Salesforce 用户记录中的电子邮件地址。

    【讨论】:

    • 我没有其余安全令牌选项。我认为我的公司禁用了它。如何使用我在网站上使用的相同密码使用 sforce 连接器登录?
    • user2242044 如果没有安全令牌,您将无法登录。
    • 贵公司可能限制了可以登录的IP。无法禁用安全令牌。
    • 如果您启用了 IP 限制,您应该使用空字符串 '' 作为安全令牌。如果您启用了 IP 限制,Salesforce 会自动将其视为有效。从技术上讲,这意味着您只需要用户名 + 密码,但通过 simple-salesforce,安全令牌的“值”必须为 not None 并且空字符串满足这一要求。
    【解决方案6】:

    如果您的 ip 被列入白名单/受信任,并且您仍然无法使用令牌进行无效登录,则您必须在连接字符串中包含 security_token='' 才能使其正常工作。

    sf = Salesforce(username='USERNAME', password='PASSWORD', security_token='')
    

    【讨论】:

      【解决方案7】:

      需要安全令牌才能登录。 每当您的密码被重置时,您的安全令牌也会被重置。 如果您没有令牌并且无法重置它。 尝试更改您的密码。

      谢谢。

      【讨论】:

      • 重置我的密码如何显示令牌是什么?另外,作为对您回答的其他问题的跟进,如果登录时我只输入密码,sforce 连接器如何获取安全令牌?
      • 重置我的密码如何显示令牌是什么?您将收到一封带有安全令牌的电子邮件。
      【解决方案8】:

      我能够测试这是否与我的安全令牌一起针对开发人员组织工作,没有任何问题。这一切都是作为没有管理员权限的标准用户完成的。使用 OrgId 失败了。

      通过重置我的密码,我收到了一个新的安全令牌。

      用户名 = 您的实例的登录名。 密码 = 你的密码

      下面的代码应该可以让您登录。

      从 simple_salesforce 导入 Salesforce

      sf = Salesforce(username='username',password='password', security_token='whatever come in reset password')

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        • 2021-08-20
        • 1970-01-01
        • 1970-01-01
        • 2019-06-24
        • 2011-11-22
        • 1970-01-01
        相关资源
        最近更新 更多