4

最近、Android アプリに Box を実装しようとしています。認証アクティビティを起動し、BoxAndroidClient オブジェクトを操作する準備を整える方法は知っていますが、トークンを保存し (SharedPreferences?)、それらをロードし、ロードされたトークンを使用して認証する方法がわからないため、ユーザーはクラウド内の自分のファイルにアクセスするたびに、自分のボックス アカウントにログインする必要があります。

以前に保存したトークンを更新しようとしました (AccessToken が正しくないという例外が発生したため)。

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: java.io.StringReader@b55b2c78; 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 に含まれるサンプルでは、​​トークンを保存する方法はカバーされていません)、誰かがその良い例を提供できますか?

4

2 に答える 2

2

トークンを自分で更新する必要はありません。sdk が自動的に行います。したがって、アクセス トークンが正しくなくても、更新トークンが正しい限り、sdk は新しいアクセス トークンを取得します。

BoxAndroidOAuthData オブジェクトはパーセル可能であるため、この方法で保存できます。また、toJSONString(new ObjectMapper()) で json 文字列にシリアル化し、Utils.parseJSONStringIntoObject(jsonString, BoxAndroidOAuthData.class) で json 文字列から逆シリアル化することもできるため、文字列に保存することもできます。Sharedpreference は選択肢の 1 つですが、必要なほど安全ではない場合があります。

最も単純な (最良ではない) 例: 1. 認証を保存: sharedPref.edit().putString("auth", authData.toJSONString(new ObjectMapper()); 2. 認証をロード: BoxAndroidOAuthData authData = Utils.parseJSONStringIntoObject(sharedPref.getString("auth"), BoxAndroidOAuthData.class); boxClient.authenticate(authData); BoxAndroidOAuthData の更新トークンがまだ有効である限り、アクセス トークン、sdk の更新について心配する必要はありません。あなたのためにそれをリフレッシュします。リフレッシュ トークンが無効な場合、sdk は AuthFatalFailureException をスローし、アプリはそれを処理する必要があります。

于 2013-07-03T17:40:47.503 に答える
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);
            }
        });

ノート :

Preference で使用しているキーは 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";
于 2014-05-03T19:49:17.650 に答える