Cómo deshacer una llamada ParseUser.setPassword ()?
Estoy permitiendo que el usuario cambie sus credenciales. Escribe el nuevo nombre de usuario, correo electrónico y contraseña y voy como:
ParseUser user = ParseUser.getCurrentUser(); user.setUsername("MY NEW NAME"); user.setEmail(email); user.setPassword("MY NEW PW"); user.saveInBackground(...);
¿Y qué? Así que esta llamada save()
puede fallar, por un gran número de razones (ejemplo: nombre de usuario ya tomado por otra persona). Puedo decir que en este caso ninguno de los campos anteriores se actualiza, lo cual es justo: muestro un error, el usuario sabe que todo salió mal.
- ¿Es Parse.com un servicio adecuado para la copia de seguridad / sincronización con SQLite en Android?
- ParseApacheHttpClient problema con Android Marshmallow: no se puede encontrar el método de referencia SSLSocketFactory.getHttpSocketFactory
- Manera correcta de extender ParseObject y tener una fábrica de consultas genéricas
- Android - No se puede iniciar el receptor com.parse.ParsePushBroadcastReceiver
- DondeNuestra consulta no parece funcionar correctamente en Parse
Las cosas se complican si observa que, incluso después de la ParseException
, el user
anterior mantiene sus campos sucios, que no se pueden guardar en el servidor. Es decir
//saveInBackground fails //... user.getUsername().equals("MY NEW NAME") // true!
Problema
Ahora, puedo conseguir estos campos de nuevo a los valores correctos llamando a user.fetch()
, pero esto no trabaja con el campo de la password
.
Esto es particularmente no deseado, porque cualquier futura llamada a save()
o tal (que no podría fallar porque tal vez es una llamada completamente diferente) actualizará la contraseña también! Es decir
//later ParseUser user = ParseUser.getCurrentUser(); user.put("stuff"); user.save();
Esto no sólo pondrá "cosas", sino también cambiar la contraseña a "MY NEW PW" .. sin el usuario nunca saber.
¿Hay alguna forma de restablecer el campo de password
local, aparte de fetch()
que no funciona? Sé que podría guardar nombre de usuario, correo electrónico y contraseña con tres consultas diferentes, pero que no es una posible solución para mi caso.
- OUTDATED DEVICE: Notificación de Parse Push a dispositivos Android
- Android: Error com.parse.ParseException: se debe especificar al menos un campo ID (installationId, deviceToken) en esta operación
- Android Parse Push Notification No se muestra Icono en Marshmallow
- La aplicación se bloquea si la aplicación se cierra mediante el servicio Push: parse.com
- Cómo verificar el ID del remitente de GCM de deviceToken en Parse.com
- KnoxVpnUidStorageknoxVpnSupported Valor de API devuelto es error falso al usar Parse api
- Varias llaves y valores de JSONObject no se guardarán en Parse
- Parse + Robolectric causando java.lang.VerifyError: Tipo incorrecto en pila de operandos
Una solución podría ser utilizar
+ becomeInBackground:
En la clase PFUser (con PFUser.currentUser (). SessionToken como token) cuando se produce un error de guardado, pero eso sigue siendo un riesgo para que fallenInBackground falle. Podría por lo menos prevenir algunos casos a happend si becomeInBackground deshace eficazmente setPassword, y acepta sessionToken actual como parámetro, no he probado eso
Si fuera mi problema trataría de crear primero un usuario antiguo y guardar todos los datos actuales, y cuando fallara, sería el momento de cambiar todo de vuelta al valor normal, o si el éxito es el momento de matar el usuario antiguo. Espero que pueda ayudar.
El texto sin formato de contraseña no se almacena en Parse y como tal no puede ser obtenido por su aplicación. Encontrado aquí https://www.parse.com/questions/get-current-users-password-to-compare-it-with-a-string
Si desea cambiar la contraseña puede utilizar ParseUser.requestPasswordResetInBackground()
para que cambie la contraseña con la ayuda de correo electrónico.
Pero si necesita obtener la contraseña realmente difícil, puede almacenarla en SharedPreferences
después del inicio de sesión.
Después de algunas pruebas y comprobaciones, he aquí alguna conclusión.
- En parse, "password" es un campo especial , no puede acceder a él por ParseUser, así es ParseUser tiene setPassword () pero no tiene método getPassword ()
- Incluso en la gestión de back-stage [Core] – [Datos] – [Usuario], puede ver el campo "contraseña" está oculto
- Es por eso que el método fetch () no puede recuperar el valor original de "contraseña"
Por lo tanto, creo que si quieren implementos por encima de lo que necesita, intente de esta manera
// First time register // ParseUser user = ParseUser.getCurrentUser(); user.setUsername("MY NAME"); user.setEmail(email); user.setPassword("MY PW"); user.put("_password", "MY PW"); // The key can't use "password", this's reserve key word in Parse // user.saveInBackground(...); // Next time update // user.setUsername("MY NEW NAME"); user.setPassword("MY NEW PW"); user.saveInBackground(...); // if have something exception // user.fetch(); // user.setPassword(user.get("_password")); user.save(); ParseUser.login("MY NAME", "MY PW"); // Error ParseUser.login("MY NAME", "MY NEW PW"); // Ok user.fetch(); user.setPassword(user.get("_password")); user.save(); ParseUser.login("MY NAME", "MY PW"); // OK
En cuanto a la última versión que he leído en el changelog:
V1.10.2 – 15 DE SEPTIEMBRE DE 2015
Nuevo: Añadido ParseObject.revert () y revertir (clave) para permitir revertir cambios sucios
Parece que esto podría ser. Era definitivamente necesario.
- Android: uso no válido de SingleClientConnManager: conexión aún asignada
- ¿Cómo uso OAuth 2.0 para enviar Gmail desde Indy?