使用Facebook SDK登录失败无效密钥错误

时间:2011-01-31 06:02:25

标签: android facebook

我在设备上运行时使用Facebook Android SDK获得“登录失败错误”。我已经做了他们指定的所有事情,比如创建哈希和所有。

错误是:

  

Facebook-authorize(5539):登录失败:invalid_key   facebook错误:com.facebook.android.FacebookError:invalid_key

13 个答案:

答案 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。

  1. 安装Cygwin。
  2. 下载适用于Windows的OpenSSL。把它放在任何文件夹中,并添加路径到“lib”& Windows PATH变量中的“bin”子文件夹。
  3. 现在您应该可以打开Cygwin Bash shell(从开始菜单)并成功运行OpenSSL。
  4. 一些keytool技巧:

    1. 不要使用Windows shell(CMD) - 始终使用Cygwin。从CMD运行keytool只是沉默产生错误的哈希!

    2. 请记住,你应该使用正确的Unix路径分隔符是“/”,而不是“\”!

    3. 如果keytool找不到密钥库文件,它只是静默生成错误密钥!如果您设置了文件的正确路径,它会询问您的“输入密钥库密码:”。所以,如果没有问你这个问题,请确保你走错路(另见#2)。
    4. 如果键入正确的密钥库密码,则哈希值与完全不传递密钥库密码的哈希值相同。如果键入错误的密钥库密码,则会以静默方式生成错误的哈希值。

答案 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上的那个不匹配。