简短版:我的 PHP 应用程序是否可以通过在服务器端执行完整的 OAuth 2.0 流程来登录到某个 Dropbox 帐户?
长版:考虑以下步骤:
- 将 Google Chrome 导航到我的 Dropbox 应用的登录页面:
https://www.dropbox.com/1/oauth2/authorize?locale=&response_type=code&client_id=[APP_CLIENT_ID] - 打开 Chrome 开发工具,进入控制台
发出以下 jQuery 调用:
jQuery.ajax({ method: 'POST', url: 'https://www.dropbox.com/ajax_login', data: { login_email: '[DROPBOX_LOGIN]', login_password: '[DROPBOX_PASSWORD]', require_role: '' }, });
现在这个浏览器登录到 Dropbox,刷新浏览器窗口就可以看到了。
如何使用 cURL 或 file_get_contents 在 PHP 中实现相同的过程?
我试过这样:
<?php
require_once "config.php";
use \Dropbox as dbx;
// init Dropbox login process
$webAuth = new dbx\WebAuthNoRedirect($appInfo, $clientId);
$authorizeUrl = $webAuth->start();
// load Dropbox login website
$ckfile = tempnam ("/tmp", "CURLCOOKIE");
$ch = curl_init($authorizeUrl);
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec ($ch);
$data = array('login_email' => '[DROPBOX_LOGIN]', 'login_password' => '[DROPBOX_PASSWORD]', 'require_role' => '');
$loginUrl = 'https://www.dropbox.com/ajax_login';
$ch = curl_init($loginUrl);
curl_setopt($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Connection: Keep-Alive'
));
$result = curl_exec ($ch);
if ($result === FALSE)
$result = curl_error($ch) . ' ' . curl_errno($ch);
但我总是以 403 Forbidden 告终。
我究竟做错了什么?
顺便说一句,我有一个合法的用例。我知道 Dropbox 使用 OAuth 2.0 来防止用户的密码进入我的服务器。但是这里使用的凭据不是来自最终用户。