我被授予了文件夹中的访问权限(协作)。我需要的是每天访问该文件夹并从中获取文件。现在,我生成的开发人员令牌在1小时后到期。有没有办法让authorization code
没有第一条腿,这需要一个用户界面。这样,每当我获取文件时,我都可以刷新访问权限。
答案 0 :(得分:10)
您应该能够在不获取授权码的情况下刷新令牌。发送访问令牌后,还会向您发送刷新令牌。
{
"access_token": "T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl",
"expires_in": 3600,
"restricted_to": [],
"token_type": "bearer",
"refresh_token": "J7rxTiWOHMoSC1isKZKBZWizoRXjkQzig5C6jFgCVJ9bUnsUfGMinKBDLZWP9BgR"
}
您应该将此刷新令牌存储在安全的位置(钥匙串,加密数据存储,类似),并在会话到期时使用它来刷新会话。
当您从Box收到任何API请求的401 Unauthorized响应时,您可以告诉会话已过期,并且您看到一个值为Bearer realm =的WWW-Authenticate标头。
流程应该类似于:
1)登录Box并获取授权码
2)交换ACCESS TOKEN和REFRESH TOKEN对的授权码(这只需要做一次!)
3)存储刷新令牌
4)开始使用API发出请求
5)当在API响应中收到带有WWW-Authenticate标头的401 Unauthorized时,向Box发出一个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调用。
希望有所帮助!
答案 1 :(得分:1)
找到一个很好的包来回答我的问题。 :) https://github.com/sookasa/box.py
答案 2 :(得分:1)
根据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();
}