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

26

我在设备上运行Facebook Android SDK时遇到“登录失败”错误。 我已经按照他们指定的做了一切,比如创建哈希等。

错误信息是:

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


你在使用 Facebook-SDK 还是 FBRocket 实现这个功能? - chikka.anddev
Facebook-SDK。我已经在开发者网站上保存了哈希值,并且我也正确地创建了哈希值。 - Aswan
你试过那个Facebook示例的演示了吗? - chikka.anddev
1
是的,我尝试过那个,甚至我得到了同样的失败。 - Aswan
13个回答

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环境会自动签署构建。有关调试密钥库的详细信息,请参见Android文档-签名应用程序

为了向Facebook提供有关签名的信息,您需要运行Jay在上面提供的命令(在此重复):

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

这会生成一个短字符串(可能包括'='或'/'等字符),用于识别证书的签名。一旦你得到了这个字符串,你需要将它提供给Facebook。

Facebook开发者页面上找到你的应用程序(如果你还没有设置,请创建一个新的)。进入应用程序摘要页面后,选择“编辑设置”,然后在左侧选择“移动设备”。在Android部分下方,你会看到一个名称为“密钥散列”的框。将上面命令中获得的证书字符串粘贴到此框中,然后点击保存。

稍等几分钟,让其生效即可!


我使用带有OSX 10.5的Macbook Pro,出现了错误“非法选项:-exportcert”,随后列出了一些可用选项和一些密钥类型字符串。我尝试使用该字符串,但是出现了“无效密钥”错误。请帮忙解决。 - Kartik

18

我刚刚花了几个小时解决同一个问题。

当你导出密钥的哈希值时,请确保指定正确的密钥库和别名。例如:

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore 
| openssl sha1 -binary
| openssl base64
如果您没有使用调试密钥对APK进行签名,请确保keytool引用了您的导出密钥库,并且它正在使用您指定的别名。在Eclipse导出Android应用程序向导屏幕的“密钥库选择”和“密钥别名选择”屏幕中,您可以看到要使用的密钥库和别名。
此外,在应用程序设置的“移动设备”部分中,我已将应用程序设置为“本机应用程序”,而不是“HTML 5 / 移动Web”,因为我正在处理一个Android应用程序(以及一个iOS应用程序)。

太蠢了,我使用了mydebug而不是androiddebugkey :( 失败了好几个小时,感谢您发布了完整路径的帖子。 - Warpzit
在此处添加 OpenSSL.exe 的路径,例如 "D:\android examples\facebook integration app\openssl-0.9.8k_X64\bin\openssl.exe"。 - harikrishnan

10
如果设备中已经安装了Facebook应用程序,将会出现上述错误。卸载现有的Facebook应用程序并运行应用程序;它可以正常工作。这是SDK问题。

2
谢谢Aswan,这里也出现了同样的问题。第一次使用现有应用程序时会询问登录,下一次就会消失。我也尝试过删除现有的FB应用程序,它可以正常工作。那么在安装现有应用程序时该怎么办呢? - Paresh Mayani
2
这是与“key”有关的问题,而不是与SDK有关。请参考@Jay Springfield的答案。 - jamapag
2
这个答案是不正确的。它不应该有勾选标记,也不应该比下面正确的答案得到更多的赞! - Yevgeny Simkin
2
如果您卸载Facebook应用程序,则您的应用程序将使用旧的WebView身份验证流程。那不是正确的解决方案。 - Erdal
3
接受自己的答案并不意味着它是正确的。这可能是一个功能性的解决方法,但并不是解决问题根本原因的解决方案。 - DougW
显示剩余6条评论

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) {}

然而,从哪里调用此方法以提供哈希密钥呢?因为Facebook在返回相同的密钥时会将+、-和/替换为_。 - jeevs

7

新手的另一个陷阱:如果您在以下命令中输入错误的密钥库密码

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

它将悄无声息地给出错误的结果(我怀疑是密码错误消息的摘要)。

通过中间文件进行操作可以避免这种情况。同时,使用Linux桌面也可能会有帮助。


3
那是我的问题 - 默认的调试密钥库密码是 android - user765140
天哪,这对我来说是解决方案。我已经尝试了所有方法,但一直在输入错误的密码。我甚至不知道我一直在输入错误的密码!谢谢 user765140。 - Kevin

3
我用以下方法修复了这个bug:
如果在授权行中添加Facebook.FORCE_DIALOG_AUTH
mFacebook.authorize(
    MundialRugby2011Activity.this,
    new String[] {"publish_stream", "read_stream", "offline_access"},
    Facebook.FORCE_DIALOG_AUTH,
    new LoginDialogListener()
);

这对我来说实际上很有效。Facebook应用程序存在漏洞,因此我们可以简单地使用Facebook SDK的对话框。 - android developer
Facebook.FORCE_DIALOG_AUTH现已被弃用。 - Parth mehta

2

我曾经遇到过类似的问题(无效密钥),我的解决方法是安装Cygwin(我使用的是64位Windows 7),并在其中重新生成密钥。我得到了一个完全不同的密钥(与PowerShell上的不同),现在我的应用程序可以成功登录。


Cygwin 对我来说并没有解决问题。尽管它生成了一个不同的密钥,但对 Facebook 来说并没有关系。 - IgorGanapolsky

1

0

我浪费了大约四个小时来解决这样一个问题(Windows 7,Eclipse)。keytool实用程序真的很狡猾。我已经安装了Eclipse。

  1. 安装Cygwin。
  2. 下载Windows版OpenSSL。将其放在任何文件夹中,并将路径添加到Windows PATH变量的“lib”和“bin”子文件夹中。
  3. 现在,您应该能够打开Cygwin Bash shell(从开始菜单)并成功地从其中运行OpenSSL。

一些keytool技巧:

  1. 不要使用Windows shell(CMD)-始终使用Cygwin。从CMD运行keytool只会产生错误的哈希值而不会有任何提示!

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

  3. 如果keytool找不到密钥库文件,它就会悄悄地生成错误的密钥!如果您设置了文件的正确路径,则会询问您“输入密钥库密码:”。因此,如果没有询问您,请确保您传递了错误的路径(也请参见#2)。
  4. 如果您输入了正确的密钥库密码,则哈希值与根本不传递密钥库密码时相同。如果您输入了错误的密钥库密码,则会悄悄地生成错误的哈希值。

0
我正在使用Phonegap和FB SDK,但是没有生成正确的密钥,也许我必须使用构建服务的哈希密钥?尽管如此,我只是在哈希中放置了cordova库,但它说与Facebook上的不匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接