Как явным образом подтвердить, что пользователь авторизовал приложение Dropbox, не засыпая и не спрашивая пользователя?

Я пишу простую программу Dropbox на Java, которая загружает файлы. Вот конкретный фрагмент кода, с которым я работаю, который создает соединение с учетной записью Dropbox. Приведенный ниже код запускается только при первом запуске приложения пользователем. После этого AccessTokenPair сохраняется для использования при последующих запусках.

AppKeyPair appKeys = new AppKeyPair(APP_KEY, APP_SECRET);
WebAuthSession session = new WebAuthSession(appKeys, ACCESS_TYPE);
dropbox = new DropboxAPI<WebAuthSession>(session);    

try {
  if (!STATE_FILE.exists()) {
    STATE_FILE.createNewFile();
    WebAuthInfo authInfo = session.getAuthInfo();
    RequestTokenPair pair = authInfo.requestTokenPair;
    String url = authInfo.url;
    URI confirmAddress = new URI(url);
    Desktop desktop = Desktop.getDesktop();
    desktop.browse(confirmAddress);
    boolean authenticated = false;
    while (!authenticated) {
        try {
            session.retrieveWebAccessToken(pair);
            authenticated = true;          
        } catch (DropboxException dbe) {
            io.tellUser("Waiting for user authentication...");
            Thread.sleep(4000);

        }
    }

    AccessTokenPair tokens = session.getAccessTokenPair();
    State state = new State(STATE_FILE);
    state.save(tokens);  

Кажется, это работает нормально, но я с осторожностью отношусь к тому, как я проверяю подлинность. Приведенный выше код откроет ссылку в браузере пользователя по умолчанию на его/ее учетную запись Dropbox, чтобы разрешить доступ к этому приложению. session.retrieveWebAccessToken(pair) выдаст DropboxException, если доступ не разрешен. Таким образом, программа в основном проверяет и перехватывает исключение, а затем засыпает снова и снова, пока доступ не будет предоставлен. Я хотел бы найти способ сделать это, не ожидая и не проверяя. Я попробовал спин-блокировку/блокировку занятости и попросил пользователя нажать кнопку после того, как он авторизует это приложение в дополнение к методу sleep(), реализованному выше. Я бы предпочел не просить пользователя о вмешательстве. Прочитав кое-что об API Dropbox, я узнал, что вы можете использовать URL-адрес обратного вызова при создании объекта WebAuthInfo, но я не уверен, как это сделать, потому что мое приложение не является веб-приложением. Кто-нибудь знает, как использовать этот обратный вызов для моих целей или любых других идей?


person Guy    schedule 23.03.2013    source источник
comment
stackoverflow.com/questions/1359689 / Полезно ли вам использовать HTTP-соединения из вашего java-кода? Если страницу входа в Dropbox можно предсказать, вы можете просто попросить пользователя ввести данные в вашем приложении, а затем перенаправить их в Dropbox. Это URL Dropbox, на который вы ссылаетесь? dropbox.com/developers/blog/20   -  person KyleM    schedule 23.03.2013
comment
Я готов использовать HTTP-соединения в своем коде. Это хорошая ссылка на дропбокс. Возможно, я смогу направить его через свой сайт. Да, формат URL-адреса такой же, как и в ссылке. Пользователь должен нажать на кнопку, как только он достигнет URL-адреса для авторизации. Это потребует небольшого исследования, прежде чем я полностью пойму, как это может работать, но спасибо за совет.   -  person Guy    schedule 23.03.2013
comment
Обратите внимание, что вы никогда не должны обрабатывать информацию о логине/пароле пользователя: dropbox.com/developers/reference/ передовой опыт   -  person Greg    schedule 23.03.2013


Ответы (1)


Есть несколько других способов обработки этого потока, кроме показанной схемы try/wait.

Лучшее, но самое сложное: используйте параметр oauth_callback в /authorize вместе с настраиваемой схемой URL, зарегистрированной для вашего приложения. Это автоматически перенаправит пользователя в ваше приложение после его авторизации, которое ваше приложение может обнаружить, а затем возобновить поток.

В противном случае вы можете просто подождать, пока пользователь не вернет «фокус» вашему приложению, и либо попытаться автоматически, либо просто попросить их указать вашему приложению попробовать вручную.

person Greg    schedule 23.03.2013