api - 如何通过 OAuth 的 accessToken 通过 CData ODBC 驱动程序对 Salesforce 进行身份验证?
问题描述
我只能从用户名和密码中获取 salesforce 数据,如下所示。
cnxn = pyodbc.connect("DRIVER={CData ODBC Driver for Salesforce};User=myUser;Password=myPassword;Security Token=myToken;")
但是如果我不想在那里提供用户名和密码,并且想使用从 Oauth 返回的 Accesstoken 访问数据。我怎样才能做到这一点?
解决方案
使用 OAuth 和 CData ODBC 驱动程序连接到 Salesforce 的说明如下:http: //cdn.cdata.com/help/RFE/odbc/pg_oauthcustomappcreate.htm(复制如下)。
简而言之,您将使用 OAuth 访问令牌和 OAuth 服务器 URL,您的代码将类似于以下内容
cnxn = pyodbc.connect("DRIVER={CData ODBC Driver for Salesforce};OAuthAccessToken=OAUTH_ACCESS_TOKEN;OAuthServerUrl=OAUTH_SERVER_URL;")
从 Web 应用程序向 Salesforce 进行身份验证
要获取访问令牌,请设置以下连接属性:
- OAuthClientId:在您的应用设置中设置为使用者密钥。
- OAuthClientSecret:在您的应用设置中设置为使用者密码。
- CallbackURL:在您的应用设置中设置为回调 URL。
通过 Web 应用程序连接时,或者如果驱动程序无权打开浏览器窗口,您需要交换访问令牌的临时验证值:
- 调用 GetOAuthAuthorizationUrl。存储过程将 URL 返回到 OAuth 端点。
- 登录并授权应用程序。您将被重定向回回调 URL。如果将 GrantType 参数设置为 Implicit,则回调 URL在查询字符串参数中包含OAuthAccessToken和OAuthServerUrl 。如果将 GrantType 参数设置为 code,则回调 URL 包含名为“code”的查询字符串参数中的验证程序代码。提取验证者代码并调用 GetOAuthAccessToken。
相关部分:
要连接到数据,请设置以下连接属性:
- OAuthAccessToken
- OAuthServerUrl
要在访问令牌过期时自动刷新,请将InitiateOAuth设置为REFRESH并设置OAuthRefreshToken。或者,在访问令牌过期时调用 RefreshOAuthAccessToken 存储过程。给定一个刷新令牌作为输入,该过程返回一个有效的 OAuth 访问令牌。
作为检索授权 URL 并让用户登录 Salesforce 的替代方法,您可以通过调用 GetOAuthAccessToken 设置密码授予类型,将 GrantType 设置为 PASSWORD。在这里,除了应用程序的客户端 ID 和密码之外,您还需要确保在连接字符串中设置了用户名和密码。请注意,必须将 InitiateOAuth 设置为 OFF 才能使密码授予类型起作用。您无法刷新以这种方式获得的令牌。此方法的优点是为无法打开 Web 浏览器的用户删除了登录步骤,但缺点是用户的凭据在服务器和 Salesforce 之间以纯文本形式交换。
注意:您可以通过导航到设置 > 管理设置 > 安全控制 > 会话设置在 Salesforce 中配置会话超时。
推荐阅读
- python - 将 webdriver-manager 与 pyinstaller 一起使用时出错
- php - 将 PHP 变量传递给 curl_init
- mysql - Magento 2 安装失败 - SQLSTATE[HY000] [1045] 用户访问被拒绝
- javascript - 我正在尝试从firestore获取用户并将它们存储在javascript中的地图中,但由于某种原因地图是空的
- python - readline() 方法给出错误:AttributeError: 'tuple' object has no attribute 'readline'
- amazon-web-services - AWS Cognito Token 端点来源是否必须与 Auth 端点来源相匹配?
- android - 将 Intent Uri 转换为路径
- javascript - 函数式编程:返回调用具有特定参数的不同函数列表的第一个真实结果
- python - 如何创建以常规文本为正文的 Google Doc?
- c++ - 使用 win32 函数和通过 system() 传递 cmd 命令有什么区别?