targetsdkversion - guardar y usar datos de autenticación en la caja de API de Android
sdk version android (2)
Así es como inicializo mi cliente Box:
mClient = new BoxClient(BOX_CLIENT_ID, BOX_CLIENT_SECRET, null, null);
mClient.addOAuthRefreshListener(new OAuthRefreshListener() {
@Override
public void onRefresh(IAuthData newAuthData) {
try {
String authToken = new BoxJSONParser(new AndroidBoxResourceHub()).convertBoxObjectToJSONString(newAuthData);
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
prefs.edit().putString("box_token", authToken).commit();
} catch (BoxJSONException e) { }
}
});
mAuthToken = prefs.getString("box_token", null);
if (mAuthToken != null) {
BoxAndroidOAuthData authData = new BoxJSONParser(
new AndroidBoxResourceHub()
).parseIntoBoxObject(mAuthToken, BoxAndroidOAuthData.class);
mClient.authenticate(authData);
}
if (!mClient.isAuthenticated()) {
Intent intent = OAuthActivity.createOAuthActivityIntent(context, BOX_CLIENT_ID, BOX_CLIENT_SECRET, false, "https://yoururl.com/");
((Activity) context).startActivityForResult(intent, BOX_AUTH_REQUEST_CODE);
}
Estoy creando una aplicación de Android que permite al usuario cargar archivos multimedia en su cuenta. Configuré el ID de mi cliente y el secreto del cliente, también está autenticando mi aplicación. También se está cargando una parte, pero el problema al que me estoy enfrentando es guardar los datos de autenticación [que obviamente se necesitan para que el usuario no necesite iniciar sesión una y otra vez]
Cargar, guardar y usar los datos de autenticación en Box API de Android, la solución dada anteriormente no está funcionando [pueden haber eliminado el método ''Utils.parseJSONStringIntoObject'']
Puedo almacenar el token de acceso y el token de actualización, pero cuál es el punto de guardar cuando no puedo usarlos para volver a autenticar a un usuario
switch (requestCode)
{
case AUTHENTICATE_REQUEST:
if (resultCode == Activity.RESULT_CANCELED)
{
String failMessage = data.getStringExtra(OAuthActivity.ERROR_MESSAGE);
Toast.makeText(this, "Auth fail:" + failMessage, Toast.LENGTH_LONG).show();
// finish();
}
else
{
BoxAndroidOAuthData oauth = data.getParcelableExtra(OAuthActivity.BOX_CLIENT_OAUTH);
BoxAndroidClient client = new BoxAndroidClient(BoxSDKSampleApplication.CLIENT_ID, BoxSDKSampleApplication.CLIENT_SECRET, null, null);
client.authenticate(oauth);
String ACCESS_TOKEN=oauth.getAccessToken();
String REFRESH_TOKEN=oauth.getRefreshToken();
Editor editor = prefs.edit();
editor.putString("ACCESS_TOKEN", ACCESS_TOKEN);
editor.putString("REFRESH_TOKEN", REFRESH_TOKEN);
editor.commit();
BoxSDKSampleApplication app = (BoxSDKSampleApplication) getApplication();
client.addOAuthRefreshListener(new OAuthRefreshListener()
{
@Override
public void onRefresh(IAuthData newAuthData)
{
Log.d("OAuth", "oauth refreshed, new oauth access token is:" + newAuthData.getAccessToken());
//---------------------------------
BoxOAuthToken oauthObj=null;
try
{
oauthObj=getClient().getAuthData();
}
catch (AuthFatalFailureException e)
{
e.printStackTrace();
}
//saving refreshed oauth object in client
BoxAndroidOAuthData newAuthDataObj=new BoxAndroidOAuthData(oauthObj);
getClient().authenticate(newAuthDataObj);
}
});
app.setClient(client);
}
Me he referido a https://github.com/box/box-android-sdk-v2/tree/master/BoxSDKSample example
¿Alguien puede decirme qué estoy haciendo mal o alguna alternativa para autenticar al usuario usando authdata, token de acceso, token de actualización?
ACTUALIZAR
refrescante token como han dicho ''Nuestro sdk auto actualiza el token de acceso OAuth cuando caduca. Querrá escuchar los eventos de actualización y actualizar su token almacenado después de actualizar.
mClient.addOAuthRefreshListener(new OAuthRefreshListener()
{
@Override
public void onRefresh(IAuthData newAuthData)
{
Log.d("OAuth", "oauth refreshed, new oauth access token is:" + newAuthData.getAccessToken());
try
{
oauthObj=mClient.getAuthData();
mClient.authenticate(newAuthData);
String authToken=null;
//Storing oauth object in json string format
try
{
authToken = new BoxJSONParser(new AndroidBoxResourceHub()).convertBoxObjectToJSONString(newAuthData);
prefs.edit().putString("BOX_TOKEN", authToken).commit();
//saving authToken in shared Preferences
mClient.authenticate(newAuthData);
String ACCESS_TOKEN=newAuthData.getAccessToken();
String REFRESH_TOKEN=newAuthData.getRefreshToken();
Log.v("New Access token ", oauthObj.getAccessToken());
Log.v("New Refresh token ", oauthObj.getRefreshToken());
editor.putString("ACCESS_TOKEN", ACCESS_TOKEN);
editor.putString("REFRESH_TOKEN", REFRESH_TOKEN);
prefs.edit().putString("BOX_TOKEN", authToken).commit();
editor.commit();
}
catch (BoxJSONException e1)
{
e1.printStackTrace();
}
Log.v("Token Refreshed", " ");
}
catch (AuthFatalFailureException e)
{
e.printStackTrace();
}
}
});
app.setClient(mClient);
}
onClientAuthenticated();
En actividad principal, obteniendo token almacenado
try
{
stored_oauth_token=prefs.getString("BOX_TOKEN", null);
authData = new BoxJSONParser(new AndroidBoxResourceHub()).parseIntoBoxObject(stored_oauth_token, BoxAndroidOAuthData.class);
}
catch (BoxJSONException e)
{
e.printStackTrace();
}
mClient = new BoxAndroidClient(BoxSDKSampleApplication.CLIENT_ID, BoxSDKSampleApplication.CLIENT_SECRET, null, null);
mClient.authenticate(authData);
BoxSDKSampleApplication app = (BoxSDKSampleApplication) getApplication();
app.setClient(mClient);
Probé esta aplicación para cargar un archivo después de que existiera, funcionó, pero después de 60-70 minutos impares no pude subir el archivo.
¿Hay algo mal en mi código?
Por lo tanto, para la actualización de autenticación hay un par de cosas que se deben considerar:
- el cliente de cuadro actualiza automáticamente los tokens de OAuth, querrá adjuntar un OAuthRefreshListener para escuchar la actualización, si quiere persistir, persista los datos oauth pasados al oyente de actualización. El oyente solo actualiza tus datos oauth persistentes, no necesitas volver a autenticarte en el oyente de refresco, sdk realiza la reautorización automáticamente.
Cuando inicie por primera vez el cliente de cuadro, debe autenticarse mediante autenticación persistente o la interfaz de usuario de OAuth. La lógica debería ser:
check client.isAuthenticated ();
2.1 Si está autenticado, no haga nada.
2.2 si no está autenticado, intente verificar si hay datos de autenticación persistentes. Si es así, autentifíquese por client.authenticate (oauthdata);
2.3 si 2.2 falló, inicie el flujo de OAuth UI.
2.4 por último, en el caso de OAuthFatalFailureException, inicie el flujo de OAuth UI.