0

ファイルを 1 つの zip ファイルにまとめる Windows アプリケーションがあります。アプリケーションでこの zip ファイルを box.com アカウントにアップロードしたいと考えています。

ユーザーにプロンプ​​トを表示せずに認証コードを取得する方法はありますか? 私のユーザーは box.com を持っていません (または知っていても)、私は既にアプリ キー、client_id、および client_secret を持っています。

4

1 に答える 1

1

次のような Web クライアントを使用して回避策を構築できます。

import java.io.IOException;
import java.net.URL;
import java.util.concurrent.ExecutionException;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.ElementNotFoundException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;

public class BoxAuth {

private String key;
private String email;
private String password;
private String redirectUrl;
private final String AUTH_URL;

public BoxAuth(String key, String email, String password, String redirectUrl) {
    super();
    this.key = key;
    this.email = email;
    this.password = password;
    this.redirectUrl = redirectUrl;
    this.AUTH_URL = "https://www.box.com/api/oauth2/authorize?response_type=code&client_id=" + key + "&redirect_uri=" + this.redirectUrl;
}

public String authorize() throws IOException, InterruptedException, ExecutionException {

    System.out.println("AUTHORIZING: " + AUTH_URL);

    final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);

    HtmlPage loginPage = webClient.getPage(AUTH_URL);
    final HtmlPage grantAccessePage = this.authorizeLogin(loginPage);
    return this.authorizeGrantAccess(grantAccessePage);

}

private HtmlPage authorizeLogin(HtmlPage page) throws IOException {

    final HtmlForm loginForm = page.getFormByName("login_form");
    loginForm.getInputByName("password");
    final HtmlTextInput emailField = (HtmlTextInput) loginForm.getInputByName("login");
    emailField.setValueAttribute(this.email);
    final HtmlPasswordInput passwordField = (HtmlPasswordInput) loginForm.getInputByName("password");
    passwordField.setValueAttribute(this.password);
    final HtmlSubmitInput loginButton = loginForm.getInputByName("login_submit");

    final HtmlPage result = loginButton.click();
    try {
        final HtmlForm test = result.getFormByName("login_form");
        throw new Exception("BoxAPI: Wrong login data!!!");
    } catch (ElementNotFoundException e) {
    }

    return result;
}

private String authorizeGrantAccess(HtmlPage grantAccessePage) throws IOException, InterruptedException, ExecutionException {
    final HtmlForm grantAccessForm = grantAccessePage.getHtmlElementById("consent_form");
    final HtmlButton grantAccess = grantAccessForm.getButtonByName("consent_accept");

    final HtmlPage codePage = grantAccess.click();

    URL url = codePage.getUrl();
    String result = "";

    if (url.toString().contains("&code=")) {
        result = url.toString().substring(url.toString().indexOf("&code="));
        result = result.replace("&code=", "");
    }

    return result;
}

}

redirect_url として、「https://app.box.com/services/yourservice」のようなものを使用できます

于 2013-11-05T16:31:36.493 に答える