Укороченная версия: Есть ли способ, которым мое PHP-приложение может войти в определенную учетную запись Dropbox, выполнив полный процесс OAuth 2.0 на стороне сервера?
Длинная версия: Рассмотрим следующие шаги:
https://www.dropbox.com/1/oauth2/authorize?locale=&response_type=code&client_id=[APP_CLIENT_ID]
Выполните следующий вызов jQuery:
jQuery.ajax({
method: 'POST',
url: 'https://www.dropbox.com/ajax_login',
data: {
login_email: '[DROPBOX_LOGIN]',
login_password: '[DROPBOX_PASSWORD]',
require_role: ''
},
});
Теперь этот браузер вошел в Dropbox, что можно увидеть, обновив окно браузера.
Как я могу реализовать ту же процедуру в PHP, используя cURL или file_get_contents?
Я попробовал это так:
<?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 Запрещено.
Что я делаю неправильно?
Кстати, у меня есть законный вариант использования для этого. Я знаю, что Dropbox использует OAuth 2.0 для предотвращения перехода пароля пользователя на мой сервер. Но учетные данные, которые используются здесь, не от конечного пользователя.
Просто завершите поток OAuth один раз для целевой учетной записи и сохраните токен доступа. Затем вы можете использовать этот токен доступа на неопределенный срок.
(Если токен доступа предназначен для учетной записи разработчика, которой принадлежит приложение, вы можете вообще пропустить поток OAuth и просто нажать кнопку «Создать» в консоли приложения, чтобы получить токен доступа для своей собственной учетной записи.)
Других решений пока нет …