Подтвердить что ты не робот

Ошибка входа в систему с ошибкой с помощью Facebook SDK

Я получаю ошибку входа в систему с помощью Android Android SDK во время работы на устройстве. Я сделал все, что они указали, например, создав хэш и все.

Ошибка:

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

4b9b3361

Ответ 1

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

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

Ответ 2

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


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

Я разрабатывал с помощью Android 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 для разработчиков (или создайте новый, если вы еще не установили его). После того, как вы на странице резюме приложения, выберите "Редактировать настройки", а затем выберите "Мобильные устройства" и "Устройства" с левой стороны. В разделе Android вы увидите окно для Key Hash. Вставьте строку сертификата из приведенной выше команды в это поле и нажмите "Сохранить".

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

Ответ 3

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

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

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

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

Кроме того, в разделе "Мобильные устройства и устройства" в настройках приложения я установил приложение "Родное приложение", а не "HTML 5/Mobile web", так как я работаю с Android-приложением (и iOS тоже).

Ответ 4

Вы можете использовать этот код 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) {}

Ответ 5

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

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

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

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

Ответ 6

Я исправил ошибку:

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

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

Ответ 7

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

Ответ 9

Я потратил около четырех часов на решение такой проблемы (Windows 7, Eclipse). Утилита keytool действительно хитра. У меня уже установлен Eclipse.

  • Установите Cygwin.
  • Загрузите OpenSSL для Windows. Поместите его в любую папку и добавьте путь к подпапкам "lib" и "bin" в переменной Windows PATH.
  • Теперь вы можете открыть оболочку Cygwin Bash (из меню "Пуск" ) и успешно запустить OpenSSL.

Некоторые трюки для клавишных:

  • НЕ ИСПОЛЬЗУЙТЕ оболочку Windows (CMD) - всегда используйте Cygwin. Запуск keytool из CMD беззвучно приводит к неправильному хешу!

  • Помните, что правильный разделитель путей Unix, который вы должны использовать, это "/", а не "\"!

  • Если keytool не может найти файл хранилища ключей, он просто генерирует ключ WRONG! Если вы установили правильный путь к файлу, он попросит ввести "Введите пароль хранилища ключей:". Итак, если вы не спрашиваете об этом, убедитесь, что вы прошли неправильный путь (см. Также № 2).
  • Если вы введете правильный пароль хранилища ключей, хэш будет таким же, как если бы вы не передали пароль хранилища ключей. Если вы вводите неверный пароль хранилища ключей, он автоматически генерирует неправильный хеш.

Ответ 10

Я использовал Cygwin для Windows и iOS Bash, но оба дали мне неправильные ключи! Наконец, я нашел решение в Внедрение Facebook в ваше приложение недействительным ключом с keytool.

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

отредактирован:

Вышеупомянутая ссылка больше не работает, но вы можете получить более подробную информацию в документах Facebook (см. параграф "Устранение неполадок" в разделе "Запустить образцы" ) https://developers.facebook.com/docs/android/getting-started/#samples

Ответ 11

Благодаря Facebook, теперь он дает ключ сам с исключением invalid_key. Используйте это значение и обновите его в настройках приложения. Я использую 64-разрядную машину Windows 7, и для меня ключ не имеет = (равно) в конце, но он работал чисто.

Ответ 12

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

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

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

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

Ответ 13

Я использую Phonegap, а FB SDK → не получил правильный ключ, возможно, мне нужно использовать хэш-ключ службы сборки? Тем не менее, я просто положил в хэш-библиотеку кордовы, что это не совпадает с тем, что было в facebook.