Как изрично да потвърдите, че потребител е упълномощил приложение за 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.com/developers/blog/20   -  person KyleM    schedule 23.03.2013
comment
Отворен съм да използвам HTTP връзки в моя код. Това е добра връзка към dropbox. Може да успея да го насоча през моя сайт. Да, форматът на URL адреса е същият като този на връзката. Потребителят трябва да щракне върху бутон, след като достигне URL адреса, за да упълномощи. Това ще отнеме малко проучване, преди да разбера напълно как може да работи, но благодаря за съвета.   -  person Guy    schedule 23.03.2013
comment
Имайте предвид, че никога не трябва да обработвате информацията за вход/парола на потребителя: dropbox.com/developers/reference/ най-добри практики   -  person Greg    schedule 23.03.2013


Отговори (1)


Има няколко други начина за справяне с този поток, различни от показаната схема опит/изчакване.

Най-доброто, но най-трудното: Използвайте параметъра oauth_callback на /authorize заедно с персонализирана URL схема, регистрирана за вашето приложение. Това автоматично ще пренасочи потребителя към вашето приложение, след като го упълномощи, което приложението ви може да открие и след това да възобнови потока.

В противен случай можете просто да изчакате, докато потребителят върне „фокуса“ към приложението ви, и или да опитате автоматично след това, или просто да го накарате да каже на приложението ви да опита ръчно.

person Greg    schedule 23.03.2013