0

简短版:我的 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 来防止用户的密码进入我的服务器。但是这里使用的凭据不是来自最终用户。

4

1 回答 1

1

只需为目标帐户完成一次 OAuth 流程并保存访问令牌。然后,您可以无限期地使用该访问令牌。

(如果访问令牌用于拥有该应用程序的开发者帐户,您可以完全跳过 OAuth 流程,只需单击应用程序控制台中的“生成”按钮即可为您自己的帐户获取访问令牌。)

于 2015-04-21T14:54:11.233 回答