我在设备上运行时使用Facebook Android SDK获得“登录失败错误”。我已经做了他们指定的所有事情,比如创建哈希和所有。
错误是:
Facebook-authorize(5539):登录失败:invalid_key facebook错误:com.facebook.android.FacebookError:invalid_key
答案 0 :(得分:25)
更新:我写了一篇关于此问题的更详细的博文,并解释了SSO如何导致它:http://sean.lyn.ch/2011/07/android-the-facebook-sdk-sso-and-you/
这个问题很久以来一直在这里得到解答(在Facebook 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 Documentation - Signing Applications。
为了向Facebook提供有关签名的信息,您需要运行Jay提供的命令(在此处重复):
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
这会生成一个短字符串(可能包含'='或'/'等字符),用于标识称为证书的签名。一旦你有这个,你需要把它交给Facebook。
在Facebook's Developer page上找到您的应用程序(如果您尚未设置新应用程序,请创建一个新应用程序)。进入应用程序摘要页面后,选择编辑设置,然后选择左侧的移动和设备。在Android部分下,您会看到一个Key Hash的框。将上面命令中的证书字符串粘贴到此框中,然后单击“保存”。
给它几分钟的宣传,你应该全力以赴!
答案 1 :(得分:18)
在同样的问题上花了几个小时。
导出密钥的哈希值时,请确保指定正确的密钥库和别名。例如:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore
| openssl sha1 -binary
| openssl base64
如果您没有使用调试密钥对APK进行签名,请确保keytool引用您的导出密钥库,并且它使用您指定的别名。您可以在Eclipse导出Android应用程序向导屏幕的“密钥库选择”和“密钥别名选择”屏幕中看到要使用的密钥库和别名。
此外,在应用设置的“移动和设备”部分下,我将应用设置为“原生应用”,而不是“HTML 5 /移动网络”,因为我正在使用Android应用(和也是一个iOS。)
答案 2 :(得分:9)
如果设备上安装了Facebook应用程序,则会引发所述错误。
卸载现有的Facebook应用程序并运行该应用程序;它运作良好。这是一个SDK问题。
答案 3 :(得分:8)
您可以使用此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) {}
答案 4 :(得分:6)
新玩家的另一个陷阱:如果你在
中弄错了密钥库密码keytool -exportcert -alias androiddebugkey -keystore~ / .android / debug.keystore | openssl sha1 -binary | openssl base64
它会默默地给出错误的结果(密码错误消息的摘要,我怀疑)。
通过中间文件可以避免这种情况。也可以使用Linux桌面。
答案 5 :(得分:3)
我用这个修正了错误:
如果您将Facebook.FORCE_DIALOG_AUTH
添加到授权行:
mFacebook.authorize(
MundialRugby2011Activity.this,
new String[] {"publish_stream", "read_stream", "offline_access"},
Facebook.FORCE_DIALOG_AUTH,
new LoginDialogListener()
);
答案 6 :(得分:2)
我有类似的问题(invalid_key),对我来说解决方案是安装Cygwin(我使用的是Windows 7 64位)并从那里重新生成密钥。我得到了一个完全不同的密钥(比在PowerShell上),现在我的应用程序确实登录了。
答案 7 :(得分:1)
我可能刚刚在Windows 7中解决了错误的keyhash问题。请参阅 Invalid key issue for an Android application to call the Facebook API 中的报告。
答案 8 :(得分:0)
我浪费了大约四个小时来解决这个问题(Windows 7,Eclipse)。 keytool实用程序非常狡猾。我已经安装了Eclipse。
一些keytool技巧:
不要使用Windows shell(CMD) - 始终使用Cygwin。从CMD运行keytool只是沉默产生错误的哈希!
请记住,你应该使用正确的Unix路径分隔符是“/”,而不是“\”!
答案 9 :(得分:0)
我在Windows和iOS Bash上使用过Cygwin,但都给了我错误的键!最后,我在 Implementing Facebook into your application invalid key with keytool 中找到了解决方案。
ProgrammerXR编写了一个非常有用的方法,直接从设备上安装的已签名应用程序中提取密钥哈希 - 太棒了!
<强>编辑:强>
上述链接不再有效,但您可以在Facebook文档中获取更多详细信息(请参阅“运行示例”部分中的“疑难解答”段落) https://developers.facebook.com/docs/android/getting-started/#samples
答案 10 :(得分:0)
感谢Facebook,现在它正在给出一个密钥以及invalid_key异常。使用该值并在应用程序设置中更新。我使用的是Windows 7 64位机器,对我而言,密钥最终没有=
(等于),但它干净利落。
答案 11 :(得分:0)
当安装Facebook应用程序时,似乎会触发此问题,因此SDK正在尝试使用该应用程序进行身份验证。在我的情况下,那部分似乎总是失败。
我目前解决此问题的方法是确保触发Web登录对话框。实现这一目标的方法是篡改Facebook.java中的FB_APP_SIGNATURE(来自GitHub的第763行最新SDK),在我的情况下,我只是用空字符串替换了最后一部分“928a2”。
通过这样做,似乎SDK会回到网络对话框上,一切正常。
请注意,这不是一个完美的解决方法,但它确实解决了Facebook SDK和Facebook App在Android上暂时不兼容的问题。
答案 12 :(得分:0)
我正在使用Phonegap和FB SDK - &gt;没有得到正确的密钥生成,也许我必须使用构建服务的哈希键?尽管如此,我只是把哈希的cordova图书馆说成与facebook上的那个不匹配。