2014-02-06 3 views
6

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

ответ

10

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

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

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

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

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

1) Вход в ящик и получить код авторизации

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

3) Хранить обновления маркера

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

5) Когда 401 Несанкционированное принимается с заголовком WWW-Authenticate в ответе API, вопрос запрос POST на WWW-форм-urlencoded боксировать так:

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 из предыдущего неудачного вызова.

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

+1

Я не считаю, что это отвечает на вопрос OPS , Вы делаете предположение, что он имеет токен обновления, который у него нет, только токен разработчика, идентификатор клиента и секрет. Кажется, что нет способа обновить токены разработчика, сделав эти вызовы oauth2. – alanwill

1

Согласно Sikppy Той

Вы можете сохранить ваш первый маркер в файл и с помощью механизма обновления с помощью такого файла.

Вот пример

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(); 
} 
Смежные вопросы