短いバージョン:サーバー側で完全な OAuth 2.0 プロセスを実行することにより、PHP アプリケーションが特定の Dropbox アカウントにログインできる方法はありますか?
長いバージョン:次の手順を検討してください。
- Google Chrome で Dropbox アプリのログイン ページに移動します。
https://www.dropbox.com/1/oauth2/authorize?locale=&response_type=code&client_id=[APP_CLIENT_ID]
- Chrome Dev Tools を開き、コンソールに移動します
次の 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 を使用して、ユーザーのパスワードがサーバーに送信されないようにしていることを知っています。ただし、ここで使用される資格情報はエンド ユーザーのものではありません。