提问人:Shibiliya Ismail 提问时间:10/2/2023 更新时间:10/2/2023 访问量:30
安全地处理 OAuth 令牌和密钥,以便与 Zoho CRM 进行电子学习平台集成
Securely Handling OAuth Tokens and Keys for eLearning Platform Integration with Zoho CRM
问:
我正在开发一个电子学习平台,我需要将其与 Zoho CRM 集成,以便在付款流程后更新付款状态。为此,我使用 OAuth 2.0 通过 Zoho CRM 的 API 进行身份验证。
我的集成过程包括几个步骤:
获取初始访问令牌:在没有用户交互的情况下,用户授权我们的应用程序后,我想使用授权码从 Zoho CRM 获取初始访问令牌。
刷新令牌:为确保访问令牌不会过期,我需要使用 Zoho CRM 提供的刷新令牌实现令牌刷新。
吊销令牌:执行所需操作后,我想撤消访问权限并刷新令牌以增强安全性。
我有几个问题和疑虑:
1. 不同用户的代币管理:
- 我应该如何安全地管理我的电子学习平台上不同用户的访问令牌?
- 将访问和刷新令牌存储在数据库或会话变量中是否安全?
2. 代币刷新:
- 如何使用刷新令牌实现令牌刷新,以使集成保持活动状态,而无需手动干预?
3. 代币撤销:
- 在客户完成交互时撤消访问权限和刷新令牌的最佳做法是什么?
4. 保护身份验证密钥:
- 如何在代码中安全地存储和使用client_id和client_secret以防止暴露?
我非常感谢任何见解、最佳实践和优化的代码示例,以帮助我为我的电子学习平台实现安全高效的 OAuth 与 Zoho CRM 的集成。感谢您的帮助!
这是我现有的令牌处理代码。
1$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://accounts.zoho.com/oauth/v2/token',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('client_id' => '','client_secret' => '','redirect_uri' => '','code' => '','grant_type' => 'authorization_code'),
CURLOPT_HTTPHEADER => array(
'Cookie: '
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://accounts.zoho.com/oauth/v2/token',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => array('client_id' => '','client_secret' => '','refresh_token' => '','grant_type' => 'refresh_token'),
CURLOPT_HTTPHEADER => array(
'Cookie: '
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://www.zohoapis.com/crm/v5/Leads/search?email=test%40gmail.com',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Authorization: Bearer ',
'Cookie: '
),
));
$response = curl_exec($curl);
curl_close($curl);
// Check if the response is not empty and is a valid JSON
if (!empty($response)) {
$data = json_decode($response, true);
// Check if the JSON was successfully decoded
if ($data !== null && isset($data['data']) && is_array($data['data'])) {
// Access and display the last recorded detail
$recordedDetails = end($data['data']); // Get the last element in the 'data' array
print_r($recordedDetails);
} else {
echo "Invalid or empty 'data' in JSON response.";
}
} else {
echo "Empty response received.";
}
答:
将访问和刷新令牌存储在数据库或会话变量中是否安全?
很难做出这样的评估,因为最终不同的人对这件事有不同的风险水平。很多人将其存储在数据库或类似 Redis 的东西中。但是您也可以将其存储在一些专为存储机密而设计的保险库中,许多主机(如亚马逊和其他主机)都有这些保险库。最好至少将其存储在单独的数据库中,以降低暴露风险。安全性不是二元的,它在很大程度上是一个滑动比例。
如何使用刷新令牌实现令牌刷新,以使集成保持活动状态,而无需手动干预?
您可以跟踪令牌的过期时间,并计划后台任务来续订令牌。
在客户完成交互时撤消访问权限和刷新令牌的最佳做法是什么?
OAuth2 具有对令牌的撤销操作。不是每个人都支持它,但他们可能会。如果您的令牌最终出现在其他系统上,这将很有帮助。理想情况下,您的令牌永远不会离开您的系统,在这种情况下,只需删除令牌也应该同样好。
如何在代码中安全地存储和使用client_id和client_secret以防止暴露?
所有通常,只要确保令牌永远不会离开您的服务器。注意不要在出错时发出堆栈跟踪,阅读 OWASP 前 10 名等。
评论