Я пишу простую программу 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
, но я не уверен, как это сделать, потому что мое приложение не является веб-приложением. Кто-нибудь знает, как использовать этот обратный вызов для моих целей или любых других идей?