2013-07-02 69 views
4

我最近試圖在我的Android應用中實現Box。我知道如何啓動身份驗證活動並獲取BoxAndroidClient對象,但是我不知道如何保存令牌(SharedPreferences?),加載它們然後使用加載的令牌進行身份驗證,因此用戶不會有每次他想要在雲中訪問他的文件時登錄到他的帳戶帳戶。

我試圖刷新以前保存的令牌(因爲Exception告訴我我的AccessToken不正確)。加載,保存和使用Box中的驗證數據Android API

BoxAndroidOAuthData data = new BoxAndroidOAuthData(new HashMap<String, Object>(){ 
    private static final long serialVersionUID = 1L; 
    { 
     put(BoxAndroidOAuthData.FIELD_ACCESS_TOKEN, prefs.acc); 
     put(BoxAndroidOAuthData.FIELD_REFRESH_TOKEN, prefs.ref); 
     put(BoxAndroidOAuthData.FIELD_EXPIRES_IN, prefs.exp); 
     put(BoxAndroidOAuthData.FIELD_TOKEN_TYPE, prefs.typ); 
    } 
}); 
data = new BoxAndroidOAuthData(client.getOAuthManager().refreshOAuth(BoxOAuthRequestObject.refreshOAuthRequestObject(data.getRefreshToken(), C, S))); 

而且我有另一個異常:

07-02 22:07:16.433: W/System.err(4684): com.box.restclientv2.exceptions.BoxRestException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type' that is to contain type id (for class com.box.boxjavalibv2.dao.BoxServerError) 
07-02 22:07:16.433: W/System.err(4684): at [Source: [email protected]; line: 1, column: 69] 
07-02 22:07:16.433: W/System.err(4684):  at com.box.restclientv2.responseparsers.DefaultBoxJSONResponseParser.parse(DefaultBoxJSONResponseParser.java:75) 
07-02 22:07:16.433: W/System.err(4684):  at com.box.boxjavalibv2.responseparsers.ErrorResponseParser.parse(ErrorResponseParser.java:31) 
07-02 22:07:16.433: W/System.err(4684):  at com.box.restclientv2.responses.DefaultBoxResponse.parseResponse(DefaultBoxResponse.java:51) 
07-02 22:07:16.433: W/System.err(4684):  at com.box.boxjavalibv2.resourcemanagers.BoxResourceManager.getResponseAndParse(BoxResourceManager.java:168) 
07-02 22:07:16.433: W/System.err(4684):  at com.box.boxjavalibv2.resourcemanagers.BoxResourceManager.getResponseAndParseAndTryCast(BoxResourceManager.java:143) 
07-02 22:07:16.433: W/System.err(4684):  at com.box.boxjavalibv2.resourcemanagers.BoxOAuthManager.refreshOAuth(BoxOAuthManager.java:68) 


因爲我還沒有找到如何在Java中做正確的權威性一部分任何教程(包含在SDK樣本不涵蓋任何儲存令牌的方法),任何人都可以提供一個很好的例子嗎?

回答

2

你不需要自己刷新標記,sdk會爲你做。所以,即使您的訪問令牌不正確,只要刷新令牌是正確的,SDK將爲您提供一個新的訪問令牌。

BoxAndroidOAuthData對象是一個parcelable,所以可以這樣保存。它也可以通過toJSONString(新的ObjectMapper())序列化爲json字符串,並通過Utils.parseJSONStringIntoObject(jsonString,BoxAndroidOAuthData.class)從json字符串反序列化,因此也可以將其保存爲字符串。 Sharedpreference是其中的一個選擇,雖然它可能不如您想要的那樣安全。

作爲一個最簡單的(不是最好的)例子: 1.保存AUTH: sharedPref.edit().putString("auth", authData.toJSONString(new ObjectMapper()); 2.負載AUTH: BoxAndroidOAuthData authData = Utils.parseJSONStringIntoObject(sharedPref.getString("auth"), BoxAndroidOAuthData.class); boxClient.authenticate(authData); 請注意儘可能在BoxAndroidOAuthData您刷新令牌仍然有效,你不需要擔心刷新訪問令牌,sdk會爲您刷新它。如果你的刷新令牌無效,sdk會拋出一個AuthFatalFailureException,你的應用需要處理它。

+0

感謝您的簡單解決方案。我會爲我的代碼添加一些加密,所以令牌會更安全。 – RedScorpio

2

這是我在我的PreferencesUtil類下面處理這個查找的方法。

package com.omt.omtboxapi; 

import java.util.HashMap; 
import java.util.Map; 

import android.content.Context; 
import android.content.SharedPreferences; 

import com.box.boxjavalibv2.dao.BoxOAuthToken; 

package com.omt.omtboxapi; 

public class PreferencesUtil { 

private static PreferencesUtil preferencesUtil; 

private PreferencesUtil() { 

} 

public static PreferencesUtil getInstance() { 

    if (preferencesUtil == null) { 

     synchronized (PreferencesUtil.class) { 

      if (preferencesUtil == null) { 
       preferencesUtil = new PreferencesUtil(); 
      } 

     } 

    } 

    return preferencesUtil; 
} 

public BoxOAuthToken getAuthToken(Context context) { 
    BoxOAuthToken authToken = null; 
    SharedPreferences preferences = context.getSharedPreferences(
      "OMT_BOX_SHARED", Context.MODE_PRIVATE); 
    if (!preferences.getBoolean("IS_NEW", true)) { 

     Map<String, Object> map = new HashMap<String, Object>(); 

     map.put(BoxOAuthToken.FIELD_ACCESS_TOKEN, 
       preferences.getString(BoxOAuthToken.FIELD_ACCESS_TOKEN, "")); 
     map.put(BoxOAuthToken.FIELD_REFRESH_TOKEN, preferences.getString(
       BoxOAuthToken.FIELD_REFRESH_TOKEN, "")); 
     map.put(BoxOAuthToken.FIELD_TOKEN_TYPE, 
       preferences.getString(BoxOAuthToken.FIELD_TOKEN_TYPE, "")); 
     map.put(BoxOAuthToken.FIELD_EXPIRES_IN, 
       preferences.getInt(BoxOAuthToken.FIELD_EXPIRES_IN, 0)); 
     authToken = new BoxOAuthToken(map); 
    } 
    return authToken; 
} 

public void saveAuthToken(BoxOAuthToken authToken, Context context) { 
    SharedPreferences preferences = context.getSharedPreferences(
      "OMT_BOX_SHARED", Context.MODE_PRIVATE); 
    SharedPreferences.Editor editor = preferences.edit(); 
    editor.putBoolean("IS_NEW", false); 
    editor.putString(BoxOAuthToken.FIELD_ACCESS_TOKEN, 
      authToken.getAccessToken()); 
    editor.putString(BoxOAuthToken.FIELD_REFRESH_TOKEN, 
      authToken.getRefreshToken()); 
    editor.putString(BoxOAuthToken.FIELD_TOKEN_TYPE, 
      authToken.getTokenType()); 
    editor.putInt(BoxOAuthToken.FIELD_EXPIRES_IN, authToken.getExpiresIn()); 
    editor.commit(); 
} 

}

我們處理下面刷新的事情是我的方法:

 client.addOAuthRefreshListener(new OAuthRefreshListener() { 

      @Override 
      public void onRefresh(IAuthData newAuthData) { 
       PreferencesUtil.getInstance().saveAuthToken(
         (BoxOAuthToken) newAuthData, MainActivity.this); 
      } 
     }); 

注:

,我使用偏好的鑰匙可在BoxOAuthToken所以不改變它,否則你的代碼將無法工作..

這些關鍵是:

public static final String FIELD_ACCESS_TOKEN = "access_token"; 
public static final String FIELD_EXPIRES_IN = "expires_in"; 
public static final String FIELD_TOKEN_TYPE = "token_type"; 
public static final String FIELD_REFRESH_TOKEN = "refresh_token"; 
相關問題