在SalesForce中获取已连接应用程序的refresh_token



我设置了一个Connected App,这是一个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服务器的流,但我被难住了。在哪里可以获得要与grant_type=refresh_token一起发送的初始refresh_token?文档似乎认为我已经有了一个refresh_token,只想在此基础上生成另一个access_token,但事实并非如此。

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

我发现并阅读了文档列表,但没有让我变得更明智:

  • https://help.salesforce.com/articleView?id=remoteaccess_oauth_tokens_scopes.htm&类型=5
  • https://help.salesforce.com/articleView?id=remoteaccess_oauth_refresh_token_flow.htm&类型=5
  • https://developer.salesforce.com/forums/?id=906F0000000AgInIAK
  • https://help.salesforce.com/articleView?id=connected_app_create_api_integration.htm&类型=5

以下是有关Web服务器OAuth流的Salesforce文档。它是这样运行的;请注意,这涉及到用户交互,因此curl本身不足以清楚地演示流程。

  • 您将用户引导到web浏览器中的Salesforce登录UI,为自己获取授权代码:

    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(注意:这也必须在您的Connected App定义中设置为回调(,例如

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

    如果你愿意,你的应用程序可以在这里显示UI,但关键是要获取授权码。

    回调URL可以位于localhost上。例如,Salesforce CLI就是这样实现组织授权的;它启动本地web服务器以接收回调。

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

    如果您的Connected应用程序设置为refresh_token作用域,那么届时您还将获得一个刷新令牌,您可以使用已识别的刷新令牌流存储该令牌,并在将来用于获取新的访问令牌。

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

相关内容

  • 没有找到相关文章