Как получить маркер доступа без страницы авторизации 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();
}