为 SalesForce 中的连接应用获取 refresh_token

Get refresh_token for Connected App in SalesForce

我设置了一个连接的应用程序,一个 Python 应用程序来代表用户以编程方式访问 Salesforce 对象(离线访问)。

该应用程序运行正常,我可以生成 access_token:

$ curl https://login.salesforce.com/services/oauth2/token -d "grant_type=password" -d "client_id=MY_APP_CLIENT_ID" -d "client_secret=MY_APP_SECRET" -d "username=my@user.com" -d "password=my_password"

{"access_token":"00D09000000KDIX!AQoAQNi1234","instance_url":"https://my_instance.salesforce.com","id":"https://login.salesforce.com/id/12345/12345","token_type":"Bearer","issued_at":"1606401330889","signature":"abc/def"}

到目前为止一切顺利。

现在我想切换到使用刷新令牌的基于 Web 服务器的流程,但我很难过。我从哪里获得初始 refresh_token 以与 grant_type=refresh_token 一起发送?文档似乎假设我已经有一个 refresh_token 并且只想基于它生成另一个 access_token,但事实并非如此。

端到端的实际步骤和必要调用是什么?

我找到并阅读但没有让我更聪明的文档列表:

这是关于 Web Server OAuth 流程的 Salesforce 文档。它像这样运行;请注意,涉及用户交互,因此 curl 本身不足以清楚地展示流程。

  • 您将用户定向到 Salesforce 登录 UI,在他们的 Web 浏览器中,以获得授权代码:

    https://login.salesforce.com/services/oauth2/authorize?client_id=<YOUR CONNECTED APP CLIENT ID>&redirect_uri=<CALLBACK URL ON YOUR SERVER>&response_type=code
    
  • 用户与授权页面交互以批准您的申请。

  • 然后用户将被重定向到您在调用中提供的应用程序中的回调 URL(注意:这也必须在您的连接应用程序定义中设置为回调), 例如,

    https://YOUR_SERVER.com/oauth2/callback?code=<AUTHORIZATION CODE>
    

    如果您愿意,您的应用可以在此处显示 UI,但重点是获取授权码。

    回调 URL 可以 在本地主机上。例如,Salesforce CLI 就是这样实现组织授权的;它会启动一个本地网络服务器来接收回调。

  • 至此,用户交互完成。您的应用程序向 Salesforce 的 /services/oauth2/token 端点发出 POST 请求,以将您收到的授权代码交换为访问令牌。

    如果您的连接应用程序设置了 refresh_token 范围,您也会在那个时候取回一个刷新令牌,您可以存储它并在将来使用它来获取新的访问令牌,使用刷新您已经确定的令牌流。

对于无头应用程序,直接使用 JWT 会更容易(如果这是您的最终目标)。我有关于如何将 JWT 身份验证与 simple_salesforce Python 库配对的 example。在连接的应用程序上填充证书并分配预批准的配置文件(或更好的权限集)需要一些初始设置,但一旦设置完成,它就会非常顺利,不需要任何用户交互。