Ошибка входа - неверный ключ с помощью Facebook SDK - PullRequest
26 голосов
/ 31 января 2011

Я получаю «Ошибка входа в систему» ​​с Android SDK Facebook при работе на устройстве.Я сделал все, что они указали, например, создание хэша и все.

Ошибка:

Facebook-authorize (5539): Ошибка входа: invalid_key Ошибка facebook: com.facebook.android.FacebookError: invalid_key

Ответы [ 13 ]

25 голосов
/ 30 июня 2011

Обновление: Я написал более подробный пост в блоге об этой проблеме и объяснил, как SSO вызывает ее: http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/


На этот вопрос уже давно дан ответ (и в Android Android SDK ), но я собираюсь попытаться найти полное решение для любого, кто в итоге наткнется на эту тему.

Я разрабатывал, используя Facebook Android SDK в сочетании с PhoneGap и плагином Phonegap Facebook. Шаг аутентификации работал нормально, пока я не перешел с развертывания на эмуляторе на реальное устройство. Ошибка, с которой я столкнулся при запуске adb logcat, была следующей.

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

Понятия не имею, почему это сработало на эмуляторе, но не сработало на устройстве. Я подозреваю, что Facebook имеет общую политику, разрешающую неподписанные приложения .apk, потому что они не могут распространяться.

Проблема в том, что Facebook требуется информация о ключе, который используется для подписи приложения, чтобы разрешить авторизацию. Чего я не знал, так это того, что среда Eclipse подписывает сборки автоматически, когда вы отправляете их на устройство с помощью отладочного хранилища ключей. Подробная информация о хранилище ключей Debug доступна в документации для Android - приложения для подписи .

Чтобы предоставить Facebook информацию о подписи, вам нужно выполнить команду, которую Jay предоставляет выше (повторяется здесь):

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

При этом генерируется короткая строка символов (которые могут включать такие символы, как '=' или '/'), которые идентифицируют подпись, называемую сертификатом. Когда у вас есть это, вы должны передать его в Facebook.

Найдите ваше приложение на странице разработчика Facebook (или создайте новое, если вы его еще не настроили). Как только вы окажетесь на странице сводной информации о приложении, выберите «Изменить настройки», а затем выберите Mobile и Устройства в левой части. В разделе Android вы увидите поле для Key Hash. Вставьте строку сертификата из приведенной выше команды в это поле и нажмите «Сохранить».

Дайте ему несколько минут для распространения, и вы должны быть готовы!

18 голосов
/ 04 февраля 2011

Просто потратил пару часов на ту же проблему.

Когда вы экспортируете хеш-значение своего ключа, обязательно укажите правильное хранилище ключей и псевдоним.Например, в:

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

Если вы не используете ключ отладки для подписи вашего APK, убедитесь, что keytool ссылается на ваше хранилище ключей экспорта и использует указанный вами псевдоним.Склад ключей и псевдоним для использования отображаются на экранах «Выбор хранилища ключей» и «Выбор псевдонима ключей» на экране мастера экспорта приложения Android для Eclipse.

Также в разделе «Мобильные устройства»В настройках я установил приложение как «Нативное приложение», а не «HTML 5 / Мобильная сеть», так как я работаю с приложением для Android (и для iOS тоже).

9 голосов
/ 31 января 2011

Если на устройстве установлено приложение Facebook, возникнет описанная ошибка.

Удалите существующее приложение Facebook и запустите приложение;это работает хорошо.Это проблема SDK.

8 голосов
/ 10 сентября 2011

Вы можете использовать этот код Java Android для создания вашего ключа:

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) {}
6 голосов
/ 06 июня 2011

Еще одна ловушка для новых игроков: если вы неправильно введете пароль хранилища ключей в

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

он будет молча давать неверный результат (я подозреваю, что дайджест для сообщения о неправильном пароле).

Работа с промежуточными файлами позволяет избежать этого. Также возможно использование рабочего стола Linux.

3 голосов
/ 16 декабря 2011

Я исправил ошибку следующим образом:

Если вы добавите Facebook.FORCE_DIALOG_AUTH в строку авторизации:

mFacebook.authorize(
    MundialRugby2011Activity.this,
    new String[] {"publish_stream", "read_stream", "offline_access"},
    Facebook.FORCE_DIALOG_AUTH,
    new LoginDialogListener()
);
2 голосов
/ 12 апреля 2011

У меня была похожая проблема (invalid_key), и для меня было решение установить Cygwin (я использую 64-битную Windows 7) и восстановить ключ оттуда.Я получил совершенно другой ключ (чем в PowerShell), и теперь мое приложение отлично выполняет вход в систему.

1 голос
/ 12 августа 2011

Возможно, я только что решил неправильную проблему с хэш-ключами в Windows 7. См. Мой отчет в Неправильная проблема с ключом для приложения Android для вызова API Facebook .

0 голосов
/ 05 февраля 2013

Я использую Phonegap и FB SDK -> не получен правильный ключ, возможно, мне нужно использовать хеш-ключ службы сборки? Тем не менее, я просто вставил в библиотеку Hash the cordova сообщение, что оно не совпадает с тем, что есть в Facebook.

0 голосов
/ 14 ноября 2011

Эта проблема возникает, когда приложение Facebook установлено, поэтому SDK пытается использовать приложение для аутентификации. И эта часть, кажется, терпит неудачу всегда в моем случае.

Мой текущий способ решения этой проблемы - убедиться, что вместо этого запускается диалоговое окно входа в Интернет. Чтобы это произошло, нужно изменить FB_APP_SIGNATURE в Facebook.java (последний SDK строки 763 из GitHub), в моем случае я просто заменил последнюю часть «928a2» пустой строкой.

При этом кажется, что SDK возвращается в веб-диалог, и все работает.

Обратите внимание, что это не идеальный обходной путь, но он решает проблему с SDK Facebook и приложением Facebook, которые на данный момент несовместимы на Android.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...