android - lite - Session.isOpened()== true pero Session.getAccessToken()== “”
facebook lite (3)
Aparte de que el SDK de Facebook es como vudú mágico, hay algo que estás haciendo que no hago en mi flujo de autenticación. Supongo que aquí el fragmento de código no está en la función de llamada Session.StatusCallback. Pase lo que pase, siempre abro la sesión para leerla antes de acceder al token desde la devolución de llamada. Esta solicitud solo incomoda al usuario durante unos pocos milisegundos con un girador de carga antes de que regrese. También ayuda en caso de que el usuario haya eliminado los permisos de su página de configuración de Facebook.
Mi flujo de autenticación es algo como esto:
private void startFbAuth() {
Session session = Session.getActiveSession();
if (session == null) {
session = new Session(getApplicationContext());
Session.setActiveSession(session);
Session.OpenRequest openReadRequest = new Session.OpenRequest(this);
openReadRequest.setPermissions(Arrays.asList({ "email" }));
openReadRequest.setCallback(statusCallback);
Session.NewPermissionsRequest permissionReadRequest = new Session.NewPermissionsRequest(this, Arrays.asList(EMAIL_PERMISSIONS));
permissionReadRequest.setCallback(statusCallback);
if (!session.isOpened() && !session.isClosed()) {
session.openForRead(openReadRequest);
} else {
session.requestNewReadPermissions(permissionReadRequest);
}
}
private Session.StatusCallback statusCallback = new SessionStatusCallback();
private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isClosed()) {
session.closeAndClearTokenInformation();
Session.setActiveSession(null);
SessionStore.clearFacebookInformation(Activity.this);
// Either throw an error or try reconnecting by calling startFbAuth
}
if (exception != null) {
session.closeAndClearTokenInformation();
Session.setActiveSession(session);
// Either throw an error or try reconnecting by calling startFbAuth
} else {
if (session.isOpened()) {
String token = session.getAccessToken();
// It shouldn''t be null or empty here
}
}
}
}
En mi aplicación, estoy intentando autenticar (iniciar sesión) al pasar la información de la sesión de Facebook (token y fecha de vencimiento) a mi servidor.
Mi secuencia de inicio de sesión en el servidor de aplicaciones es la siguiente:
- Obtener sesión de facebook activa.
- Si la sesión es válida, obtenga el token y envíelo al servidor.
Y en código:
Session session = Session.getActiveSession();
if(session != null && session.isOpened() && !didLogin) {
didLogin = true;
String token = session.getAccessToken();
Date expires = session.getExpirationDate();
loginWithFacebookSession(token, expires);
}
Me he dado cuenta de que, de repente, después de unos meses de que esto funcione bien, la información que se envía al servidor a veces no es válida, específicamente el token
es una cadena vacía y la fecha de expires
es una fecha no válida.
Después de revisar un poco el SDK de Facebook (versión 3.0.1), descubrí cuál es probablemente la base de mi error:
private static final Date MIN_DATE = new Date(Long.MIN_VALUE);
private static final Date ALREADY_EXPIRED_EXPIRATION_TIME = MIN_DATE;
private static final Date DEFAULT_LAST_REFRESH_TIME = new Date();
static AccessToken createEmptyToken(List<String> permissions) {
return new AccessToken("", ALREADY_EXPIRED_EXPIRATION_TIME, permissions, AccessTokenSource.NONE,
DEFAULT_LAST_REFRESH_TIME);
}
Esto significa que en algún punto del camino, el SDK de Facebook está creando un token vacío y lo está devolviendo con un SessionState.Category.OPENED_CATEGORY
.
¿Por qué session.isOpened()
devuelve true
cuando en realidad no hay información de accessToken
? ¿Debo revisar una propiedad diferente? ¿Es esto un error en el SDK de Facebook?
EDITAR:
Informé esto a Facebook en: https://developers.facebook.com/bugs/121924628017965
Resolví el problema. El problema estaba en Hash clave.
Sigue este tutorial
ve al paso no. 4 Ejecutar las muestras.
por fin encontrarás la sección de resolución de problemas y esa es la solución.
¡Gracias! https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/
Usa este método y verifica si tu hash es correcto
public void getHashKeyForFacebook(Activity activity, String packageName){
try{
PackageInfo info = activity.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures){
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (Exception ex){
}
}