1

我正在用 Java 编写一个简单的 Dropbox 程序来上传文件。这是我正在使用的特定代码,它创建了与 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)将抛出DropboxExceptionif 访问未被允许。所以程序基本上检查并捕获异常,然后一遍又一遍地休眠,直到被授予访问权限。我想找到一种无需等待和检查即可完成此任务的方法。除了上面实现的方法之外,我还尝试了自旋锁/忙锁并要求用户在授权此应用程序后按下按钮sleep()。我宁愿不要求用户干预。在阅读了一些 Dropbox API 之后,我了解到在构造WebAuthInfo反对,但我不确定如何使它工作,因为我的应用程序不是网络应用程序。有谁知道如何将该回调用于我的目的或任何其他想法?

4

1 回答 1

0

除了显示的尝试/等待方案之外,还有其他一些方法可以处理此流程。

最好的,但也是最困难的:在 /authorize 上使用 oauth_callback 参数以及为您的应用注册的自定义 URL 方案。这将在授权后自动将用户重定向到您的应用程序,您的应用程序可以检测到然后恢复流程。

否则,您可以等到用户将“焦点”返回给您的应用程序,然后自动尝试,或者让他们告诉您的应用程序然后手动尝试。

于 2013-03-23T19:13:07.780 回答