Error de clave no válida de inicio de sesión con Facebook SDK

Recibo un “Error al iniciar sesión” con Facebook SDK de Android mientras se ejecuta en el dispositivo. He hecho todo lo que especificaron, como crear un hash y todo.

El error es:

Autorización de Facebook (5539): Error de inicio de sesión: error de facebook de invalid_key: com.facebook.android.FacebookError: invalid_key

Actualización: escribí una publicación de blog más detallada sobre este problema y explica cómo lo hace SSO: http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/


Hace mucho tiempo que respondimos a esta pregunta (y en Facebook SDK de Android ), pero intentaré capturar la solución completa para cualquiera que termine tropezando con este hilo.

Desarrollaba usando Facebook Android SDK en combinación con PhoneGap y Phonegap Facebook plug in. El paso de autenticación funcionaba bien hasta que pasé de implementar en el emulador a un dispositivo real. La falla que vi al ejecutar adb logcat fue la siguiente.

 D/Facebook-authorize( 2194): Login failed: invalid_key W/System.err( 2194): com.facebook.android.FacebookError: invalid_key 

No tengo idea de por qué funcionó en el emulador pero falló en el dispositivo. Sospecho que Facebook tiene una política general para permitir aplicaciones .apk sin firmar, porque no se pueden distribuir.

El problema es que Facebook necesita información sobre la clave utilizada para firmar la aplicación a fin de permitir la autorización. Lo que no sabía es que el entorno de Eclipse está firmando creaciones automáticamente cuando las inserta en el dispositivo usando un almacén de claves de depuración. Los detalles sobre el almacén de claves de depuración están disponibles en la documentación de Android – Aplicaciones de firma .

Para proporcionar a Facebook información sobre la firma, debe ejecutar el comando que Jay proporciona arriba (se repite aquí):

 keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 

Esto genera una pequeña cadena de caracteres (que pueden incluir caracteres como ‘=’ o ‘/’) que identifican la firma llamada certificado. Una vez que tienes esto, debes dárselo a Facebook.

Encuentre su aplicación en la página de Desarrolladores de Facebook (o cree una nueva si aún no ha configurado una). Una vez que esté en la página de resumen de la aplicación, elija Editar configuración y luego seleccione Móvil y dispositivos en el lado izquierdo. En la sección Android, verá un cuadro para Key Hash. Pegue la cadena del certificado desde el comando de arriba en este cuadro y presione guardar.

¡Dale unos minutos para propagarte y deberías estar todo listo!

Solo pasé un par de horas con el mismo problema.

Cuando está exportando el valor hash de su clave, asegúrese de especificar el almacén de claves correcto y el alias. Por ejemplo en:

 keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64 

Si no está utilizando la clave de depuración para firmar su APK, asegúrese de que keytool haga referencia a su almacén de claves de exportación y de que esté utilizando el alias que ha especificado. Verá el almacén de claves y el alias que se utilizarán en las pantallas “selección del almacén de claves” y “selección de alias clave” en la pantalla del asistente de la aplicación para Android Eclipse Export.

Además, en la sección “Dispositivos y dispositivos móviles” de la configuración de la aplicación, configuré la aplicación como “Aplicación nativa” y no como “HTML 5 / Web móvil” porque estoy trabajando con una aplicación de Android (y una de iOS). también).

Si la aplicación de Facebook está instalada en el dispositivo, se generará el error descrito.

Desinstale la aplicación de Facebook existente y ejecute la aplicación; está funcionando bien. Este es un problema de SDK.

Puede usar este código Java de Android para generar su clave:

 try { PackageInfo info = getPackageManager().getPackageInfo("**YOURPACKAGENAME**", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.i("PXR", Base64.encodeBytes(md.digest())); } } catch (NameNotFoundException e) {} catch (NoSuchAlgorithmException e) {} 

Otra trampa para nuevos jugadores: si obtiene la contraseña del almacén de claves incorrecta en

keytool -exportcert -alias androiddebugkey -keystore ~ ​​/ .android / debug.keystore | openssl sha1 -binary | openssl base64

en silencio dará el resultado incorrecto (el resumen del mensaje de contraseña equivocado, sospecho).

Trabajar a través de archivos intermedios evita esto. También es posible usar un escritorio Linux.

Arreglé el error con esto:

Si agrega Facebook.FORCE_DIALOG_AUTH a la línea autorizada:

 mFacebook.authorize( MundialRugby2011Activity.this, new String[] {"publish_stream", "read_stream", "offline_access"}, Facebook.FORCE_DIALOG_AUTH, new LoginDialogListener() ); 

Tuve un problema similar (invalid_key) y para mí la solución fue instalar Cygwin (estoy usando Windows 7 de 64 bits) y regenerar la clave desde allí. Obtuve una clave totalmente diferente (que en PowerShell) y ahora mi aplicación no inicia sesión correctamente.

Es posible que haya resuelto el problema de keyhash incorrecto en Windows 7. Consulte mi informe en el problema de la clave no válida para que una aplicación de Android llame a la API de Facebook .

Este problema parece activarse cuando se instala la aplicación de Facebook, por lo que el SDK intenta usar la aplicación para la autenticación. Y esa parte parece fallar siempre en mi caso.

Mi solución actual para resolver esto es asegurarme de que el cuadro de diálogo de inicio de sesión web se active. La manera de hacer que eso ocurra es manipular el FB_APP_SIGNATURE en Facebook.java (el último SDK de Line 763 de GitHub), en mi caso acabo de reemplazar la última parte “928a2” con una cadena vacía.

Al hacer esto, parece que el SDK vuelve a caer en el cuadro de diálogo web y todo funciona.

Tenga en cuenta que esta no es una solución perfecta, pero sí resuelve el problema con el SDK de Facebook y la aplicación de Facebook que son incompatibles por el momento en Android.

Perdí cerca de cuatro horas resolviendo tal problema (Windows 7, Eclipse). La herramienta keytool es realmente astuta. Ya tenía instalado Eclipse.

  1. Instala Cygwin.
  2. Descarga OpenSSL para Windows. Colóquelo en cualquier carpeta y agregue la ruta a las subcarpetas “lib” y “bin” en la variable PATH de Windows.
  3. Ahora debería poder abrir el shell Cygwin Bash (desde el menú de inicio) y ejecutar OpenSSL con éxito desde allí.

Algunos trucos de keytool:

  1. NO USE el shell de Windows (CMD): siempre use Cygwin. Ejecutando keytool desde CMD solo en silencio produce el hash incorrecto!

  2. ¡Recuerde que el separador de ruta de Unix correcto que debe utilizar es “/”, no “\”!

  3. ¡Si la herramienta de claves no puede encontrar el archivo del almacén de claves, simplemente genera silenciosamente la llave INCORRECTA! Si establece la ruta correcta al archivo, le pregunta a “Ingresar la contraseña del almacén de claves:”. Por lo tanto, si no se lo pregunta, asegúrese de pasar por un camino equivocado (consulte también el n. ° 2).
  4. Si escribe la contraseña correcta del almacén de claves, el hash es el mismo que si no pasa una contraseña del almacén de claves. Si escribe la contraseña del almacén de claves incorrecta, genera silenciosamente el hash incorrecto.

Gracias a Facebook, ahora se está dando una clave junto con la excepción invalid_key. Use ese valor y actualice en la configuración de la aplicación. Estoy usando la máquina con Windows 7 de 64 bits y, para mí, la clave no tiene = (igual a) al final, pero funcionó limpiamente.

Estoy usando Phonegap y FB SDK -> no obtuve una clave correcta generada, tal vez tengo que usar la clave hash del servicio de comstackción? Sin embargo, acabo de poner en la biblioteca Hash the cordova decir que no coincide con la de facebook.

He usado Cygwin en Windows y iOS Bash, ¡pero ambos me dieron las claves incorrectas! Finalmente, encontré la solución en Implementing Facebook en la clave inválida de tu aplicación con keytool .

ProgrammerXR ha escrito un método realmente útil que extrae el hash de la clave directamente de la aplicación firmada instalada en el dispositivo, ¡genial!

editado:

El enlace anterior ya no funciona, pero puede obtener más detalles en los documentos de Facebook (consulte el párrafo “Solución de problemas” en la sección “Ejecutar las muestras”) https://developers.facebook.com/docs/android/getting -started / # muestras