Ошибка входа - неверный ключ с помощью Facebook SDK
Я получаю "Ошибка входа в систему" с помощью Android Android SDK при работе на устройстве. Я сделал все, что они указали, как создание хэша и все.
Ошибка:
Facebook-авторизация (5539): сбой при входе: invalid_key ошибка facebook: com.facebook.android.FacebookError: invalid_key
13 ответов
Если на устройстве установлено приложение Facebook, возникнет описанная ошибка.
Удалите существующее приложение Facebook и запустите приложение; это работает хорошо. Это проблема SDK.
Обновление: я написал более подробное сообщение в блоге об этой проблеме и объясняет, как SSO вызывает ее: http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/
На этот вопрос уже давно дан ответ (и в Android SDK Facebook), но я постараюсь найти полное решение для всех, кто в конечном итоге наткнулся на эту тему.
Я разрабатывал, используя 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 (или создайте новое, если оно еще не установлено). Как только вы окажетесь на странице сводной информации о приложении, выберите "Изменить настройки", а затем выберите " Мобильные устройства и устройства" в левой части. В разделе Android вы увидите поле для Key Hash. Вставьте строку сертификата из приведенной выше команды в это поле и нажмите "Сохранить".
Дайте ему несколько минут для распространения, и вы должны быть готовы!
Просто потратил пару часов на ту же проблему.
Когда вы экспортируете хеш-значение вашего ключа, обязательно укажите правильное хранилище ключей и псевдоним. Например, в:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore
| openssl sha1 -binary
| openssl base64
Если вы не используете ключ отладки для подписи вашего APK, убедитесь, что keytool ссылается на ваше хранилище ключей экспорта и использует указанный вами псевдоним. Вы видите хранилище ключей и псевдоним для использования на экранах "Выбор хранилища ключей" и "Выбор псевдонима ключа" на экране мастера экспорта приложений Android для Eclipse.
Кроме того, в разделе "Мобильные устройства и устройства" в настройках приложения я установил приложение как "Собственное приложение", а не "HTML 5 / Мобильная сеть", так как я работаю с приложением Android (и iOS). также).
Вы можете использовать этот код 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) {}
Еще одна ловушка для новых игроков: если вы неправильно введете пароль хранилища ключей
keytool -exportcert -alias androiddebugkey -keystore ~ /.android/debug.keystore | openssl sha1 -binary | openssl base64
он будет молча давать неверный результат (я подозреваю, что дайджест для сообщения о неправильном пароле).
Работа через промежуточные файлы позволяет избежать этого. Также возможно использование рабочего стола Linux.
Я исправил ошибку с этим:
Если вы добавите Facebook.FORCE_DIALOG_AUTH
на строку авторизации:
mFacebook.authorize(
MundialRugby2011Activity.this,
new String[] {"publish_stream", "read_stream", "offline_access"},
Facebook.FORCE_DIALOG_AUTH,
new LoginDialogListener()
);
У меня была похожая проблема (invalid_key), и для меня было решение установить Cygwin (я использую 64-битную Windows 7) и восстановить ключ оттуда. Я получил совершенно другой ключ (чем в PowerShell), и теперь мое приложение прекрасно выполняет вход.
Возможно, я только что решил неправильную проблему с хэш-ключами в Windows 7. См. Мой отчет в разделе " Недопустимая проблема с ключом" для приложения Android для вызова API Facebook.
Эта проблема возникает, когда приложение Facebook установлено, поэтому SDK пытается использовать приложение для аутентификации. И эта часть, кажется, терпит неудачу всегда в моем случае.
Мой текущий способ решения этой проблемы состоит в том, чтобы убедиться, что вместо этого запускается диалоговое окно веб-входа. Чтобы это произошло, нужно подделать FB_APP_SIGNATURE в Facebook.java (последний SDK строки 763 из GitHub), в моем случае я просто заменил последнюю часть "928a2" пустой строкой.
При этом кажется, что SDK возвращается в веб-диалоге, и все работает.
Обратите внимание, что это не идеальный обходной путь, но он решает проблему с Facebook SDK и приложением Facebook, которое на данный момент несовместимо на Android.
Я использовал Cygwin на Windows и iOS Bash, но оба дали мне неправильные ключи! Наконец, я нашел решение во Внедрении Facebook в недействительный ключ вашего приложения с помощью keytool.
Программист XR написал действительно полезный метод, который извлекает хэш ключа прямо из подписанного приложения, установленного на устройстве, - великолепно!
отредактирован:
Приведенная выше ссылка больше не работает, но вы можете получить более подробную информацию в документации Facebook (см. Пункт "Устранение неполадок" в разделе "Запуск примеров") https://developers.facebook.com/docs/android/getting-started/
Благодаря Facebook теперь он сам дает ключ вместе с исключением invalid_key. Используйте это значение и обновите в настройках приложения. Я использую Windows 7 64-битную машину и для меня ключ не имеет =
(равно) в конце концов, но это сработало чисто.
Я потратил около четырех часов на решение такой проблемы (Windows 7, Eclipse). Утилита keytool действительно хитрая. Я уже установил Eclipse.
- Установите Cygwin.
- Загрузите OpenSSL для Windows. Поместите его в любую папку и добавьте путь к подпапкам "lib" и "bin" в переменной Windows PATH.
- Теперь вы сможете открыть оболочку Cygwin Bash (из меню "Пуск") и успешно запустить из нее OpenSSL.
Некоторые хитрости keytool:
НЕ ИСПОЛЬЗУЙТЕ оболочку Windows (CMD) - всегда используйте Cygwin. Запуск keytool из CMD просто тихо выдает неправильный хеш!
Помните, что правильный разделитель пути Unix, который вы должны использовать, это "/", а не "\"!
- Если keytool не может найти файл хранилища ключей, он просто генерирует WRONG ключ! Если вы указали правильный путь к файлу, он запросит ваш "Введите пароль хранилища ключей:". Так что, если он не спрашивает вас об этом, убедитесь, что вы выбрали неправильный путь (см. Также #2).
- Если вы введете правильный пароль хранилища ключей, хеш будет таким же, как если бы вы вообще не передавали пароль хранилища ключей. Если вы введете неправильный пароль хранилища ключей, он автоматически создаст неправильный хеш.
Я использую Phonegap и FB SDK -> не получен правильный ключ, может быть, мне нужно использовать хеш-ключ службы сборки? Тем не менее, я просто вставил в библиотеку Hash the cordova сообщение, что оно не совпадает с тем, что есть на Facebook.