Как получить маркер доступа без страницы авторизации Box

Мне был предоставлен доступ (collaborate) в папке. Мне нужно ежедневно получать доступ к папке и извлекать из нее файлы. Сейчас разработчик маркер я создать истекает в 1 час. Есть ли способ получить authorization code без первого этапа, для которого требуется пользовательский интерфейс. Таким образом, я могу обновить ток доступа всякий раз, когда я получаю файлы.

3 ответов


вы должны иметь возможность обновить токен без получения кода авторизации. Когда маркер доступа отправляется обратно, вам также выдается маркер обновления.

{
    "access_token": "T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl",
    "expires_in": 3600,
    "restricted_to": [],
    "token_type": "bearer",
    "refresh_token": "J7rxTiWOHMoSC1isKZKBZWizoRXjkQzig5C6jFgCVJ9bUnsUfGMinKBDLZWP9BgR"
}

вы должны хранить этот токен обновления в безопасном месте (брелок, зашифрованное хранилище данных, что-то подобное) и использовать его для обновления сеанса по истечении срока его действия.

вы можете сказать, что сеанс истек, когда вы получаете 401 несанкционированный ответ от коробки для любого запроса API, и вы видите WWW-аутентифицировать заголовок со значением Bearer realm=.

поток должен выглядеть примерно так:

1) Войдите в поле и получите код авторизации

2) обмен кодом авторизации для токена доступа и пары токенов обновления (это нужно сделать только один раз!)

3) сохраните токен обновления

4) Начните делать запросы с API

5) Когда 401 несанкционированный получен с заголовком www-Authenticate в API ответ, выдайте запрос www-form-urlencoded POST в поле следующим образом:

curl https://www.box.com/api/oauth2/token \ -d 'grant_type=refresh_token&refresh_token={valid refresh token}&client_id={your_client_id}&client_secret={your_client_secret}' \ -X POST

в случае успеха вам будет выдан новый токен доступа и пара токенов обновления. Сохраните новый маркер обновления, замените старый маркер доступа на новый и возобновите вызовы API из предыдущего неудачного вызова.

надеюсь, что это поможет!


нашел хороший пакет, который отвечает на мой вопрос. :) https://github.com/sookasa/box.py


согласно Sikppy Ta

вы можете сохранить свой первый токен в файле и использовать механизм обновления через такой файл.

вот пример

static String tokenUrl = "https://app.box.com/api/oauth2/token";

public String getTokenFromFile() throws Exception {

    String path = this.tokenFilePath;
    File file = new File(path);
    String line = "", token = "";
    try {
        BufferedReader br = new BufferedReader(new FileReader(file));
        while ((line = br.readLine()) != null) {
            token = line;
        }
        br.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    String newRefleshToken = refleshToken(token);
    String accessToken = newRefleshToken.substring(17, 49);
    return accessToken;
}

для refreshToken вам нужен HTTPClient

private String refleshToken(String tokencode) throws Exception {
    String accessToken = tokencode.substring(17, 49);
    String refleshToken = tokencode.substring(105, 169);
    tokencode = HttpURLConnectionExample.refreshToken(refleshToken);
        writeTokenToTextFile(tokencode);
        return tokencode;
    }

 public static String refreshToken(String newToken) throws Exception {


    String urlParameters = "grant_type=refresh_token&refresh_token=" + newToken + "&client_id=" + client_id + "&client_secret=" + client_secret;

    String result = sendPost(tokenUrl, urlParameters);
    return result;
}

позвольте мне показать метод sendPost

String sendPost(String url, String urlParameters) throws Exception {

   URL obj = new URL(url);
   HttpsURLConnection con = (HttpsURLConnection) obj.openConnection();

   //add reuqest header
   con.setRequestMethod("POST");
   con.setRequestProperty("User-Agent", USER_AGENT);
   con.setRequestProperty("Accept-Language", "en-US,en;q=0.5");

   // Send post request
   con.setDoOutput(true);
   DataOutputStream wr = new DataOutputStream(con.getOutputStream());
   wr.writeBytes(urlParameters);
   wr.flush();
   wr.close();

   int responseCode = con.getResponseCode();
   System.out.println("Response Code : " + responseCode);

   BufferedReader in = new BufferedReader(
           new InputStreamReader(con.getInputStream()));
   String inputLine;
   StringBuffer response = new StringBuffer();

   while ((inputLine = in.readLine()) != null) {
       response.append(inputLine);
   }
   in.close();

   return response.toString();
}