【问题标题】:How to authenticate Salesforce through CData ODBC driver via OAuth?如何通过 OAuth 通过 CData ODBC 驱动程序对 Salesforce 进行身份验证?
【发布时间】:2020-02-25 12:49:13
【问题描述】:

我已经为 Salesforce 安装了 CData ODBC 驱动程序,并且能够通过用户名、密码和安全令牌连接 Salesforce。我也想通过 OAuth 访问。我已按照以下链接中提到的所有步骤进行操作。我们怎样才能走得更远。

http://cdn.cdata.com/help/RFE/odbc/pg_oauth.htm

这是我通过用户名、密码和安全令牌连接 Salesforce 并能够将数据保存在 csv 文件中的代码。如何通过 OAuth 做同样的事情?

import pyodbc
import csv
cnxn = pyodbc.connect("DRIVER={CData ODBC Driver for Salesforce};User=yourusername;Password=password;Security Token=security token;")
cursor = cnxn.cursor()
query = "SELECT * from AccountPartner"
cursor.execute(query)
csvfile=open('persons.csv','w', newline='')
obj=csv.writer(csvfile)
for row in cursor:
    print(row)
    obj.writerow(row)
csvfile.close()

【问题讨论】:

    标签: python-3.x oauth-2.0 salesforce odbc cdata-drivers


    【解决方案1】:

    您需要的说明在文档的下方(也在下面复制):http://cdn.cdata.com/help/RFE/odbc/pg_oauthcustomappcreate.htm

    您需要在 Salesforce 中创建自定义应用程序,然后在连接字符串中设置规定的 OAuth 相关连接属性。您创建连接的代码如下所示:

    cnxn = pyodbc.connect("DRIVER={CData ODBC Driver for Salesforce};OAuthClientID=MY_CONSUMER_KEY;OAuthClientSecret=MY_CONSUMER_SECRET;OAuthCallbackURL=https://localhost:33333;InitiateOAuth=GETANDREFRESH;")
    

    您可能需要先在 Python 之外测试连接并触发 OAuth 流。该过程的说明可以在帮助 (http://cdn.cdata.com/help/RFE/odbc/pg_unixODBConlinux.htm) 的 Unix ODBC 部分中找到,但也可以在下面复制。


    从文档中复制的说明

    创建连接的应用程序

    获取 OAuth 客户端凭据、使用者密钥和使用者 秘密:

    1. 登录 Salesforce.com。
    2. 从设置中,在快速查找框中输入应用程序,然后单击链接以创建应用程序。
    3. 在结果页面的 Connected Apps 部分中,单击 New。输入要在用户登录以授予应用程序权限时显示给用户的名称,以及联系人电子邮件地址。
    4. 单击启用 OAuth 设置并在回调 URL 框中输入一个值。如果您正在制作桌面应用程序,请将回调 URL 设置为 http://localhost:33333 或您选择的其他端口号。如果您正在制作 Web 应用程序,请将回调 URL 设置为 Web 应用程序上您希望用户在授权您的应用程序后返回的页面。
    5. 选择您的应用应向用户请求的权限范围。
    6. 单击您的应用程序名称以打开一个页面,其中包含有关您的应用程序的信息。将显示 OAuth 客户端凭据、使用者密钥和使用者密码。

    从桌面应用程序向 Salesforce 进行身份验证

    设置以下连接属性后,即可进行连接:

    • OAuthClientId:在您的应用设置中设置为使用者密钥。
    • OAuthClientSecret:在您的应用设置中设置为使用者密码。
    • CallbackURL:在您的应用设置中设置为回调 URL。
    • InitiateOAuth:设置为 GETANDREFRESH。您可以使用 InitiateOAuth 来避免重复 OAuth 交换并手动设置 OAuthAccessToken 连接属性。

    当您连接时,驱动程序会在您的默认浏览器中打开 OAuth 端点。登录并授予应用程序权限。然后驱动程序完成以下 OAuth 过程:

    1. 获取回调 URL 并设置访问令牌和 OAuthServerUrl 以对请求进行身份验证。
    2. 将 OAuth 值保存在 OAuthSettingsLocation 中,以便跨连接持久保存。
    3. 将返回的刷新令牌交换为新的有效访问令牌。

    使用 unixODBC

    定义一个 DSN

    通过向odbc.ini.odbc.ini 添加条目来创建DSN。下面是一个示例 DSN 条目:

    [CData Salesforce Source]
    Driver=/opt/cdata/cdata-odbc-driver-for-salesforce/lib/libsalesforceodbc.x64.so
    OAuthClientID=MY_CONSUMER_KEY
    OAuthClientSecret=MY_CONSUMER_SECRET
    OAuthCallbackURL=https://localhost:33333
    InitiateOAuth=GETANDREFRESH
    

    测试连接

    您可以使用 unixODBC 测试工具 isql 从命令行对 Salesforce 执行 SQL 查询。测试连接时,使用 -v 标志输出来自驱动程序管理器和驱动程序的任何消息。

    isql -v "CData Salesforce Source"
    

    【讨论】:

    • InitiateOAuth 是什么意思,我们应该在那里给出什么?
    • Getting "[unixODBC]驱动程序需要用户提示进行 OAuth 身份验证,这是此应用程序不允许的。在此应用程序中使用驱动程序之前,请使用 DSN 管理器进行身份验证。(-1) ( SQLDriverConnect)" 错误
    • 您需要在 python 脚本之外测试连接才能触发 OAuth 流程。您可以在帮助中阅读有关在 Linux 中执行此操作的更多信息:http://cdn.cdata.com/help/RFE/odbc/pg_unixODBConlinux.htm
    • 除了上面的代码之外,我可以通过在 .odbc.ini 而不是 odbc.ini 中添加上面提到的细节来做到这一点。感谢您提供信息。
    【解决方案2】:

    在此处输入代码在您的连接字符串中进行如下更改

    cnxn = pyodbc.connect("DRIVER={CData ODBC DRIVER for
    Salesforce};InitiateOAuth='GETANDREFRESH';OAuthClientId='myclient_id';OAuthClientSecret='my_secret';callbackurl='my_redirect_uri';oauthaccesstoken='my_access_token';oauthserverurl='server_url_returned_in_oauth';OAuthRefreshToken='refresh_token';")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 2016-05-24
      • 1970-01-01
      • 2017-09-18
      • 2011-05-03
      • 2017-04-07
      • 2015-12-08
      相关资源
      最近更新 更多