токен доступа к Dropbox для загрузки в мою папку другими пользователями

Я планирую, чтобы серверная программа получала токен доступа к моей учетной записи Dropbox и перешла на

клиентская программа для загрузки в мою папку Dropbox. Клиенту не нужна учетная запись БД или логин, и он может отправлять файл в мою папку БД (таким образом, НЕ используя OAuth ...). Что-то похожее:

это и это

но без загрузки пользователя на сервер сначала, то есть, как только пользователь получает токен доступа, они загружаются непосредственно в БД.

Я попытался использовать Apache httpclient 4.3 для имитации браузера для выполнения получения токена запроса, отправки информации для входа в систему для получения токена доступа, но застрял при загрузке файла по почте в форму. Ошибка: неверный запрос HTTP 400 ...



    executing request:GET https://www.dropbox.com/login HTTP/1.1
    ----------------------------------------
    HTTP/1.1 200 OK
    Request Token: moiejtzdLqTA_0sh3gQyNZAI

    executing request:POST https://www.dropbox.com/login HTTP/1.1
    ----------------------------------------
    HTTP/1.1 200 OK
    Access Token: 5Ot52QKDbDPSsL1ApU4MIapJ

    executing request:POST https://dl-web.dropbox.com/upload?

    name=sample.jpg&dest=upload&cookie_t=5Ot52QKDbDP....SsJ&t=5Ot5...apJ HTTP/1.1
    ----------------------------------------
    HTTP/1.1 400 Bad Request

Я использовал Firefox LiveHttpHeader для захвата заголовков при входе в систему и загрузке файла, и увидел, что сообщение для загрузки файла на самом деле делает это (и отражается в коде):

https://dl-web.dropbox.com/chunked_upload?
  name=tmp1.jpg
  &chunk=0
  &chunks=1
  &bjar=W3sic2Vzc1..............Q%253D%253D
  &blid=AAAw4tn................2cDxA
  &cookie_t=32yq........nw6c34o
  &dest=
  &t=32yqVof........c34o
  &reported_total_size=5611
  &upload_id=1BKGRRP5TpCEjcWSu5tmpQ
  &offset=0

Итак, по-видимому, я пропустил какой-то параметр, но не могу понять, что. Маркер доступа кажется действительным, поскольку я могу видеть информацию о своей учетной записи в ответе из сообщения httpclinet на https://www.dropbox.com/home, но загрузка просто не работает. Кто-нибудь имеет аналогичный опыт и получает ошибку HTTP 400? .... Огромное спасибо !

Некоторый код, как показано ниже:

Конструктор и main ():



    // constructor ...
        public HttpClientExample() {
            gcookies = new BasicCookieStore();  
            globalConfig = RequestConfig.custom()
                    .setCookieSpec(CookieSpecs.BEST_MATCH)
                    .build();

            // Create local HTTP context
            ghttpContext = HttpClientContext.create(); 
            ghttpContext.setCookieStore(gcookies);

            //
            redirectStrategy = new LaxRedirectStrategy();  // for http redirect ...
            httpclient = HttpClients.custom()   
                    .setDefaultRequestConfig(this.globalConfig)
                    .setDefaultCookieStore(this.gcookies)
                    .setRedirectStrategy(redirectStrategy)
                    .build();       
        }  // constructor ...

        public static void main(String[] args) throws Exception {

            HttpClientExample myhttp = new HttpClientExample();
            try {

                    this.localConfig = RequestConfig.copy(this.globalConfig)
                    .setCookieSpec(CookieSpecs.BROWSER_COMPATIBILITY)
                    .build();

                String requestToken = this.getRequestToken(httpclient, loginurl);

                theAccessToken = this.postForAccessToken(requestToken, loginurl);

                String localFileTopassIn = this.localPath ;
                this.postToUpload(httpclient, this.theAccessToken, localFileTopassIn , this.dropboxFolderOnlyName);


            }

        }

Получите токен запроса:



private String getRequestToken(HttpClient client, String theURL) throws Exception {
    HttpGet httpget = new HttpGet(theURL);
    httpget.setConfig(localConfig);     
    httpget.setHeader("Connection", "keep-alive");

    System.out.println("\nexecuting request:" + httpget.getRequestLine());


    // Create a custom response handler
    ResponseHandler responseHandler = new ResponseHandler() {

        public String handleResponse(final HttpResponse response)
                           throws ClientProtocolException, IOException {
            int status = response.getStatusLine().getStatusCode();
            if (status >= 200 ) { // && status  cookies = gcookies.getCookies();
    for (Cookie aCookie: cookies) {
        String cookieName = aCookie.getName();
        if ( !(cookieName.lastIndexOf(gvcString) == -1) ) {
            gvc = aCookie.getValue();
        } else if ( !(cookieName.lastIndexOf(tString) == -1) ) {
            requestToken = aCookie.getValue();
        }
    }

    System.out.println("Request Token: " + requestToken );
    return  requestToken;           

}

postForAccessToken:



private String postForAccessToken(HttpClient client, String requestToken, String theURL) throws Exception{
    /*
     *  Send a post together with request token and my login to get accessToken ...
     */
    HttpPost httppost = new HttpPost(theURL); // loginurl);
    httppost.setConfig(localConfig);
    ghttpContext.setCookieStore(gcookies);

    List params = new LinkedList();
    params.add(new BasicNameValuePair("login_email", myemail));
    params.add(new BasicNameValuePair("login_password", mypasswd));
    params.add(new BasicNameValuePair("t", requestToken));

    HttpEntity postentity = new UrlEncodedFormEntity(params); 
    httppost.setEntity(postentity); 

    System.out.println("\nexecuting request:" + httppost.getRequestLine());

    // Create a custom response handler
    ResponseHandler responseHandler = new ResponseHandler() {

        public String handleResponse(final HttpResponse response)
                           throws ClientProtocolException, IOException {
            int status = response.getStatusLine().getStatusCode();
            if (status >= 200 ) { // && status  cookies = gcookies.getCookies();
    for (Cookie aCookie: cookies) {
        String cookieName = aCookie.getName();
        if ( !(cookieName.lastIndexOf(tString) == -1) ) {
            theAccessToken = aCookie.getValue();
        }
    }

    System.out.println("Access Token: " + theAccessToken );     
    return theAccessToken;
}   

postToUpload:


private String postToUpload(HttpClient client, String accessToken, String localFileInfo, String destPath) throws Exception{

    String bjarString = "bjar";
    String blidString = "blid";
    String bjar=null;
    String blid=null;
    List cookies = gcookies.getCookies();
    for (Cookie aCookie: cookies) {
        String cookieName = aCookie.getName();
        if ( !(cookieName.lastIndexOf(bjarString) == -1) ) {
            bjar = aCookie.getValue();
        } else if ( !(cookieName.lastIndexOf(blidString) == -1) ) {
            blid = aCookie.getValue();
        }
    }   

    String[] fileNameArry = localFileInfo.split("(\\\\|/)");
    String filename = fileNameArry[fileNameArry.length - 1];  // get the last part ...

    URI uri = new URIBuilder()
            .setScheme("https")
            .setHost("dl-web.dropbox.com")
            .setPath("/upload")
            .setParameter("name", filename)
            .setParameter("dest", destPath)        
            .setParameter("cookie_t", accessToken)
            .setParameter("t", accessToken)
            .build();

    HttpPost httppost = new HttpPost(uri);
    httppost.setConfig(localConfig);

    ghttpContext.setCookieStore(gcookies);

    FileBody bin = new FileBody(new File(localFileInfo));
    StringBody comment = new StringBody("A binary file of some kind", ContentType.DEFAULT_BINARY);

    HttpEntity reqEntity = MultipartEntityBuilder.create()
            .addPart("bin", bin)
            .addPart("comment", comment)
            .build();

    httppost.setEntity(reqEntity);  

    // add header
    httppost.setHeader("Host", "www.dropbox.com");
    httppost.setHeader("User-Agent", USER_AGENT);
    httppost.setHeader("Accept",
            "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
    httppost.setHeader("Connection", "keep-alive");
    httppost.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
    httppost.setHeader("Pragma", "no-cache");
    httppost.setHeader("Cache-Control", "no-cache");

    // add entity
    System.out.println("\nexecuting request:" + httppost.getRequestLine());

    // Create a custom response handler
    ResponseHandler responseHandler = new ResponseHandler() {

        public String handleResponse(final HttpResponse response)
                           throws ClientProtocolException, IOException {
            int status = response.getStatusLine().getStatusCode();
            if (status >= 200 ) { // && status 

person Roger PP.    schedule 23.11.2013    source источник


Ответы (2)


OAuth - единственный способ использовать Dropbox API. Если у вас есть токен доступа OAuth (который вы получаете при однократной аутентификации, в данном случае с вашей учетной записью), вам просто нужно выполнить HTTP PUT на https://api-content.dropbox.com/1/files_put/auto/<path> с заголовком Authorization: Bearer <token> и содержимым файла в теле.

Обратите внимание, что любой, у кого есть ваш токен доступа, также может удалить все ваши файлы, загрузить свою личную коллекцию DVD и т. Д. Поэтому не рекомендуется делиться этим токеном доступа.

person user94559    schedule 24.11.2013
comment
Часть об авторизации заголовка: Bearer ‹token› очень полезна, в том числе и для запросов GET. Dropbox не упоминает об этом нигде в своей документации. - person Charles Robertson; 22.03.2015
comment
Это просто стандартный OAuth 2. (Любой API, использующий OAuth 2, работает таким же образом.) Но мы постараемся сделать лучшую работу в документации, указав на это. - person user94559; 23.03.2015

Есть files_get_ Contemporary_upload_link:

Получите одноразовую временную ссылку для загрузки, чтобы загрузить файл в папку Dropbox.
Эта конечная точка действует как отложенная загрузка. Возвращенная временная ссылка для загрузки может использоваться для выполнения запроса POST с данными для загрузки. Затем загрузка будет выполняться с использованием CommitInfo, ранее предоставленного get_porary_upload_link, но оцениваемого только при использовании. Следовательно, об ошибках, возникающих из-за недопустимой CommitInfo в отношении состояния Dropbox пользователя, будет сообщаться только во время использования. Кроме того, эти ошибки отображаются как общие ответы HTTP 409 Conflict, потенциально скрывающие детали проблемы. Максимальная продолжительность временной ссылки для загрузки составляет 4 часа. После использования или истечения срока действия необходимо будет создать новую ссылку. Для определенного пути загрузки в любой момент времени может существовать несколько ссылок.

Таким образом, вам нужен токен доступа для вызова этой функции, но загрузчику нужен только созданный URL, без доступа к остальной части хранилища Dropbox.

person tzot    schedule 24.11.2020