0

短いバージョン:サーバー側で完全な 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 を使用して、ユーザーのパスワードがサーバーに送信されないようにしていることを知っています。ただし、ここで使用される資格情報はエンド ユーザーのものではありません。

4

1 に答える 1