Android Facebook集成无效的密钥哈希

242

在我的一个应用程序中,我需要从Facebook获取数据...我正在这样做:

我已经创建了应用ID。它成功登录,但在注销后重新登录时,它会提示:

Facebook无效密钥哈希错误的屏幕截图

我做错了什么?我正在使用Facebook SDK... 我已经在手机上安装了Facebook... 它在模拟器中正常运行,但那里没有内置的Facebook应用程序。

这是我的代码:

if (FB_APP_ID == null) {
    Builder alertBuilder = new Builder(this);
    alertBuilder.setTitle("Warning");
    alertBuilder.setMessage("A Facebook Applicaton ID must be " +
                            "specified before running this example: see App.java");
    alertBuilder.create().show();
}

// Initialize the dispatcher
Dispatcher dispatcher = new Dispatcher(this);
dispatcher.addHandler("login", LoginHandler.class);
dispatcher.addHandler("stream", StreamHandler.class);
dispatcher.addHandler("logout", LogoutHandler.class);

// If a session already exists, render the stream page
// immediately. Otherwise, render the login page.
Session session = Session.restore(this);
if (session != null) {
    dispatcher.runHandler("stream");
}
else {
    dispatcher.runHandler("login");
}

12
第一次登录时它可以运行良好,但是如果我在注销后重新登录,则无法正常工作。 - Android
1
是的,我已经创建了。使用try { PackageInfo info = getPackageManager().getPackageInfo( "com.facebook.samples.hellofacebook", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); } - Android
1
我在这里解决了这个问题!这里的理解很酷![https://dev59.com/bW435IYBdhLWcg3woRnG#12405323] - Madi
4
即使这篇文章较旧,但我还是应该提及。当用户登出然后重新登录时,这种情况不会发生。这种情况只会在第二次调试即重新安装应用程序时发生,因此哈希值会改变。这种情况在已签名的应用程序(准备上线的)中不会发生。 - Nilay Vishwakarma
3
如果卸载Facebook应用程序,您是否仍会遇到相同的错误?我使用两部手机进行测试,只有在安装了Facebook应用程序时才会出现此错误。 - Jaime Montoya
显示剩余7条评论
30个回答

289
生成的哈希密钥错误。获取哈希密钥的方法有两种:
一种是通过命令提示符,另一种是通过编码。通过命令提示符获得的哈希密钥仅在第一次使用时有效,原因不明,我也遇到了同样的问题。所以我尝试了编程方式。
按照以下步骤操作:
将以下代码粘贴到 oncreate() 中。
try {
    PackageInfo info = getPackageManager().getPackageInfo(
                           "com.example.packagename",
                           PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
    }
}
catch (NameNotFoundException e) {
}
catch (NoSuchAlgorithmException e) {
}

请务必将上述代码中的"com.example.packagename"改为您的包名(您可以在Android manifest文件中找到您的包名)。

运行您的应用程序。 转到您粘贴上述代码的活动。 在LogCat文件中搜索"KeyHash" 。 您可能会找到一个密钥哈希值。 复制密钥哈希并转到Facebook应用程序仪表板页面。 转到设置并输入以下图像中的详细信息。

输入图像说明

完成上述步骤后,重新启动应用程序。 您现在可以登录Facebook了。 有关密钥哈希的更多详细信息,请查看链接

如果您在设置页面中添加了错误信息,则会出现一些错误。 因此,请在那里使用正确的信息。 如果公众(除您之外的其他人)需要使用您的应用程序,则需要启用权限(在设置旁边的"状态和审核"中更改"是")


21
通过这种方式,很可能您获得了一个用于调试密钥库的关键哈希。它适用于开发模式,但不一定适用于生产模式。至少,对于我的生产应用程序来说,它不起作用。 - Liangjun
嘿,通过这段代码 PackageInfo info = getPackageManager().getPackageInfo( "com.example.packagename", PackageManager.GET_SIGNATURES); for (Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); 当我在Windows的cmd中运行命令时,发送了不同的哈希密钥,但日志仍显示程序代码的哈希值。我已将其添加到FB中。 - Sagar Devanga
我通过桌面命令提示符生成了密钥哈希,并添加到Facebook仪表板,但错误仍然存在... - Sauron
我有两个疑问。 第一个: 在我们记录了 Key Hash 之后,我们可以从 onCreate 方法中删除上面的代码吗?第二个: 这个 Key Hash 是否适用于发布的应用程序(在应用商店中的应用程序) - Nimmagadda Gowtham
1
节省了我很多时间。仍然是最好的。检查详细信息以获取keyhash并将其复制粘贴到Facebook开发者页面中。不要犯手动输入的错误!此外,请注意,每次卸载和安装应用程序时,keyhash都会更改。 - sanjeev
显示剩余3条评论

262

10
谢谢!它有效!你也可以使用终端命令:echo YOUR_SHA1_CERTIFICATE_COPIED_FROM_GOOGLE_PLAY | sed s/\://g | xxd -r -p | base64 - Yuriy Seredyuk
如果过一段时间你想找出这些哈希值的所有密钥是什么,可以使用以下命令进行反转:echo "hash_from_facebook" | base64 -D | xxd -p | awk '{print toupper($0)}' | sed 's/../&:/g;s/:$//' - splatte
我需要在Facebook开发者账户中添加发布密钥哈希或调试哈希吗? - sejn
非常感谢。经过两天的寻找解决方案,这是我找到的最佳答案。 - alifnaiech

141

如果您遇到这个问题,那么将此密钥放入您的developer.facebook.com中:

图片描述

然后确保您的应用程序在developer.facebook.com上是live的。

这个绿色圆圈表示应用正在运行:

图片描述

如果它没有运行,请按以下两个步骤使您的应用程序在线:

步骤1 进入您的应用程序→设置添加联系人邮箱并保存更改。

步骤2 转到应用审核选项,确保此切换开关为Yes。 我添加了一张截图:

图片描述

注意:如果您想复制哈希密钥,请在LogCat中检查BlueServiceQueue。


5
有没有一种简单的方法可以从手机上复制那个哈希值? - Daniels Šatcs
5
@DanielShatz,这个出现在logcat中。我是在逐字逐句地复制后才发现的。 - Alaa M.
5
请在logcat中查找标签BlueServiceQueue - Alaa M.
7
这个回答对我有用。我手动尝试了几次输入哈希后,出现了同样的错误。问题是我输入了大写字母"I"而不是小写字母"l"。花了一些时间才意识到这一点。 - Markus
2
这个程序可以工作,但我想知道FB从哪里获取这个哈希密钥?没有人想知道吗?错误显示了正确的工作哈希密钥,但即使使用所有命令或从Google应用签名中获取sha1到base64,也无法得到FB在错误中显示的密钥...无论如何,感谢这个技巧。 - Umar3x
显示剩余14条评论

102

我遇到了同样的问题。我确信它是由一个非常小的错误引起的,最后确认了这一点!

我找到了解决方法:

在我的电脑上生成debug哈希密钥时,我输入了我的系统密码。但密码应该是以下内容 -

输入密钥库密码:"android"。 这是我情况下唯一的问题。

----- 用此命令生成Debug密钥哈希 -

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

输入密钥库密码:'android'

----- 要生成发布密钥哈希,请使用此命令 -

keytool -exportcert -alias "alias of keystore" -keystore "Your path to the keystore when signing app" | openssl sha1 -binary | openssl base64

执行此命令后,请提供您的密钥库密码。


7
使用“android”作为密码对我起作用。这令人困惑。 - adbie
3
生成哈希密钥时,请使用“android”作为密码。 - Akash Bisariya
2
在 Windows 机器上,确保正确设置了 OpenSSL\bin 和 Java..\bin 文件夹的路径变量。同时设置 HOMEPATH 变量以便能够使用 Facebook 的命令。 - KawaiKx
1
至少在Mac上,我必须安装Java JDK才能使其正常工作。否则,上述调试命令仍会生成哈希值,但哈希值无法使用,您也不会被提示输入密码。安装了JDK后,这个问题得到了完美解决。 - lejonl
1
神奇地为我工作了,谢谢! - Serhii Harbovskyi
显示剩余5条评论

22

我遇到了同样的问题。我对这种奇怪行为的可能原因进行了简短的调查,发现以下情况:

  • 在首次执行新的 Facebook 应用程序时,即使您没有指定任何密钥哈希,它也将允许连接/登录。

  • 对我来说,Facebook 提供的教程没有生成正确的密钥哈希,因为它提供了错误的配置。当执行以下命令时:

    keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl
    base64
    

确保检查所有属性 - HOMEPATH,密钥库的存在等。也许你还需要提供密码。

  • 生成正确配置的方法是由@Mahendran建议的解决方案

  • 另外,如果你看到最初发布的错误信息 (http://i.stack.imgur.com/58q3v.png),最可能的是你在屏幕上看到的密钥哈希是你的真实密钥哈希。如果其他方法都没有效果,请尝试在Facebook中输入它。

我在Windows 7 64位版、Android Studio 1.2.2和JDK 7上获得了所有这些结果。


2
Linux版本:keytool -exportcert -alias androiddebugkey -keystore $HOME/.android/debug.keystore | openssl sha1 -binary | openssl base64 - ruX
2
只需输入 Facebook 在设备屏幕上显示的内容,就可以正常工作。感谢提醒 @Martin。 - ralphgabb

19

以下是我解决此问题的方法:

首先,您需要获取SHA-1值。有两种方法可以做到这一点。

在Android Studio中获取SHA-1值。

  1. 点击Gradle
  2. 点击Signing Report
  3. 复制SHA-1值

或者

keystore文件中获取SHA-1值。

keytool -list -v -keystore keystore_file_name.jks -alias key0

请按照以下方式将SHA-1值复制到剪贴板:

CD:A1:EA:A3:5C:5C:68:FB:FA:0A:6B:E5:5A:72:64:DD:26:8D:44:84

打开 十六进制 -> Base64 字符串解码器,将您的 SHA-1 值转换为 Base64。

这是 Facebook 要求的。

获取生成的哈希值 " ********************= " 并将密钥哈希复制到 Facebook 应用程序中。


这个答案对我有效。 - awaik
对我有用...你应该会得到长寿 :) @Sajid Zeb - Android is everything for me

15

根据Facebook登录Android版,您必须提供密钥哈希值。为了获得它,您需要使用用于签名应用程序的密钥

keytool \
    -exportcert \
    -alias YourKeyAlias \
    -storepass YourStoreKeyPassword \
    -keystore PathToYourKeyStoreFile | openssl sha1 -binary | openssl base64

1
只需添加一条注释,使用您的生产密钥库。 - Liangjun
2
@Liangjun实际上,你应该使用所有的键,否则你将无法在调试环境下测试Facebook登录。 - Pijusn
2
@Pius,是的,我实际上使用了两个键。我应该明确说明的。 - Liangjun
我执行这个命令时出现了错误(没有Java运行时,请求安装),但我仍然得到了一个密钥,但它是无效的,我只是复制粘贴了从logcat中告诉我的那个未被识别的密钥。 - Cristi Băluță

8

我尝试了之前所有的答案,但无法解决与客户的问题!

然后我的客户想起他的设备上安装了Facebook应用程序。在他删除它之后,登录工作得非常完美。

哈希键已更改,我已经在Facebook开发人员控制台中使用来自错误的密钥替换了旧的哈希键(如上所建议),现在它可以正常工作了!

可能是Facebook应用本身出了问题,因此最好在安装了Facebook应用的设备和未安装Facebook应用的设备上解决这个问题,并处理两种情况...


是的,我也遇到了这个问题,安装Facebook应用程序后在设备上发生了错误。因此,我目前在Facebook开发设置中放置了2个哈希密钥。 - stuckedoverflow
3
我有和你非常相似的情况。对我有帮助的是到你的 Facebook 页面 - 设置 - 应用程序 - 从列表中移除该应用程序。更改哈希密钥并重新安装 Facebook 应用程序和你的应用程序。现在就可以正常使用了... - anna_manzhula

8

您需要创建两个密钥哈希,一个用于Debug模式,一个用于Release模式。

对于Debug密钥哈希:

在OS X上运行:

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

在Windows上运行:
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl
base64

Debug key hashes source

对于 发布版 的密钥散列:

在 OS X 上运行以下命令(将<>中的值替换为您自己的值):

keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

在 Windows 上,请使用以下方式(将<>中的内容替换为您的值):
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64

发布密钥哈希源代码


我在执行这个命令时遇到了一个错误(没有安装Java运行时),但是我仍然得到了一个密钥,但是它是无效的,为了使其工作,我只需复制粘贴来自logcat的密钥即可。 - Cristi Băluță
也许你还没有在命令行中设置Java和keytool的路径?@CristiBăluță - MBH

7
尽管这个问题已经在许多有用的方式中得到了解答,但我想补充一点,当我按照 Rafal Maleks 的回答(在 Google Play 控制台上使用哈希键)时,我无法使用应用签名 SHA1 密钥,仍然收到 Facebook 的通用错误。相反,我需要使用来自 Google Play 控制台上“上传证书”部分(位于应用签名部分下方)的 SHA-1 证书指纹。除此之外,流程相同。
  1. 从 Google Play 控制台的“上传证书”部分复制 SHA-1 证书指纹

  2. 使用http://tomeko.net/online_tools/hex_to_base64.php将 SHA-1 转换为 base64 并复制输出

  3. 将其粘贴到 developer.facebook.com 上的 Key Hashes 输入中并保存更改。

希望这个答案不会太冗余,并且能够帮助那些无法使用应用程序签名证书的人。
现在我的应用已经可以在调试和发布模式下使用 Facebook 登录。

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