我设置了一个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_salesforce
Python库配对的示例。在连接的应用程序上填充证书并分配预先批准的配置文件(或更好的权限集(需要一点初始设置,但一旦设置完成,就非常顺利,不需要任何用户交互。