Android Facebook与无效密钥哈希的集成


194

在我的一个应用程序中,我需要从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
是的,我已经使用尝试创建{。PackageInfo info = getPackageManager()。getPackageInfo(“ com.facebook.samples.hellofacebook”,PackageManager.GET_SIGNATURES); 对于(签名签名:info.signatures){MessageDigest md = MessageDigest.getInstance(“ SHA”); md.update(signature.toByteArray()); Log.d(“ KeyHash:”,Base64.encodeToString(md.digest(),Base64.DEFAULT)); }
Android

1
我在这里解决了这个问题!在这里理解很酷![ stackoverflow.com/questions/5306009/… ] [1]
Madi 2014年

3
@Android尽管这很旧,但我应该提一下。用户注销然后登录时不会发生这种情况。这是在您第二次调试时发生的,即在调试时重新安装应用程序。因此,哈希改变。如果已签名的应用程序(已准备好生产),则不会发生这种情况
Nilay Vishwakarma

1
如果您卸载Facebook应用程序,会得到同样的错误吗?我从两部手机进行了测试,并且仅在安装Facebook App时发生此错误。
Jaime Montoya

Answers:


274

生成的哈希密钥错误。您可以通过两个步骤来获取哈希键。

一种是通过命令提示符。另一个是通过编码。通过命令提示符的哈希键仅在第一次使用。我不知道原因 我也有同样的问题。所以我以编程方式尝试了一下。

跟着这些步骤:

将以下代码粘贴到中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清单文件中找到您的包名称)。

运行您的应用程序。转到粘贴以上代码的活动。在LogCat文件中,搜索“ KeyHash”。您可能会发现密钥哈希。复制密钥哈希并转到Facebook应用程序仪表板页面。进入设置并输入下图所示的详细信息。

在此处输入图片说明

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

如果您在设置页面中添加了错误的信息,这意味着它将给出一些错误。因此,请在此处使用正确的信息。而且,如果公众(除了您之外)需要使用您的应用程序,则意味着您需要启用权限(在设置旁边的“状态与审查”中更改“是”)


20
通过这种方式,很可能您获得了调试密钥库的密钥哈希。它在开发模式下对您有效,而在生产模式下则不必要。至少,它不适用于我的生产应用程序。
梁军2014年

3
谢谢,您节省了我很多时间... facebook官方文档不应该读这是胡扯
DjP 2014年

非常感谢老兄!
KinGPinG 2014年

嘿,这段代码PackageInfo info = getPackageManager()。getPackageInfo(“ com.example.packagename”,PackageManager.GET_SIGNATURES); 对于(签名签名: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

1
节省了我很多时间。仍然是最好的。检查密钥哈希的详细信息,然后将其复制并粘贴到facebook开发人员页面中。不要犯手动输入的错误!另外,请了解每次卸载和安装应用程序时,密钥哈希都会更改。
桑耶夫

187

如果您使用的是Google Play应用签名:

在Google Play控制台中打开“ 应用签名”部分,然后在“ 应用签名证书”下获取SHA-1哈希。然后使用以下工具将其转换为Base64十六进制-> base64字符串解码器

控制台截图

转换为Base64屏幕截图


14
先生!你是救星!满满的爱。当我将本地发行密钥中的哈希值放入Facebook控制台时,我正在使用Play商店的签名。
塔哈·鲁沙因

4
您救了我的命,我正在使用
React

7
谢谢!有用!您也可以使用终端命令: echo YOUR_SHA1_CERTIFICATE_COPIED_FROM_GOOGLE_PLAY | sed s/\://g | xxd -r -p | base64
Yuriy Seredyuk

4
这是生产环境需要做的事情!!!竖起大拇指!
Bikey

正是我想知道的。每次卸载并安装应用程序时,Hashkey都会在调试中发生变化。对于已签名的APK,这是最佳解决方案!谢谢您,让生活更轻松!
桑耶夫

122

如果您遇到此问题,请将此密钥放入您的developer.facebook.com

在此处输入图片说明

然后确保你的应用程序是developer.facebook.com

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

在此处输入图片说明

如果不是,请按照以下两个步骤使您的应用生效:

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

步骤2转到“ 应用程序查看”选项,并确保此切换为。我添加了一个屏幕截图:

在此处输入图片说明

注意:如果要复制哈希键,请检查LogCat中的BlueServiceQueue 。


5
有没有一种简单的方法可以从手机复制该哈希值?
Daniel Shatz

4
@DanielShatz它出现在logcat中。我是逐个复制后才发现的。
Alaa M.

4
@DanielShatz BlueServiceQueue在logcat中寻找标签
Alaa M.

4
这个答案对我有用。在尝试手动键入哈希之后,它给了我同样的错误,问题是,我键入了大写字母i“ I”,而不是小写字母L“ l”。花了我一些时间来意识到这一点。
Markus

1
这是可行的,但我想知道FB从哪里获得此哈希密钥?没有人知道吗?该错误显示了可以正常工作的哈希键,但是即使使用所有命令,或者从Google App签名将sha1转换为base64都给了我FB在错误中显示的键...无论如何,谢谢您的

82

我遇到了同样的问题。我确定这是由于很小的错误造成的,是的!

我找到了解决方案:

在计算机上生成调试哈希密钥时,我输入了系统密码。但密码应为以下内容-

输入密钥库密码:“ android”。这是我的唯一问题。

-----要生成调试键哈希,请使用以下命令-

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

输入密钥库密码:“ android”

-----要生成Release密钥哈希,请使用以下命令-

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

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


5
使用“ android”作为密码对我有效。这令人困惑。
adbie

3
生成哈希密钥时,请使用此“ android”作为密码。
阿卡什

2
在Windows计算机上,确保为openssl \ bin和java .. \ bin文件夹正确设置了路径变量。还设置HOMEPATH变量以能够使用来自facebook的命令。
KawaiKx

1
至少在Mac上,我必须安装Java JDK才能使其正常工作。否则,上面的debug命令仍然会生成一个哈希,但是该哈希无法正常工作,并且不会提示您输入密码。安装了JDK后,这就像一个魅力。
lejonl

1
这个答案应该是正确的答案
Evan Ngo

20

我遇到了同样的问题。我对这种奇怪行为的可能原因进行了简短的研究,发现以下内容:

  • 在首次执行新的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

1
只需输入在设备屏幕上由facebook显示的内容,即可正常工作。感谢您的来信@Martin
ralphgabb

14

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

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

1
只想添加评论,使用您的生产密钥库。
梁军2014年

2
@Liangjun实际上,您应该使用所有密钥,因为否则您将无法在调试环境中测试Facbeook登录。
Pijusn

2
@Pius,是的,我实际上同时使用了两个键。我应该说清楚了。
梁军2014年

我收到此命令错误(没有Java运行时,要求安装。),但仍然也得到了一个密钥,但是它是无效的,我只是从logcat复制并粘贴了一个,告诉我未被识别。
Cristi Băluță

8

您必须创建两个关键哈希,一个用于Debug,另一个用于Release。

对于调试键哈希:

在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

调试键哈希源

对于Release键哈希:

在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复制粘贴了一个
密钥

也许您没有在命令行中设置Java和keytool的路径?@ CristiBăluță
MBH

7

我尝试了所有以前的答案,但没有任何帮助客户的案例!

然后我的客户想起他在设备上安装了Facebook App。在他删除它之后。登录完美。

哈希键已更改,我用错误中的键替换了Facebook Developers Console上的旧哈希键(如上所述),它可以正常工作!

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


是的,这里是相同的,我在设备上安装了Facebook应用后收到了此错误。所以目前我在Facebook开发设置上放了2个哈希键。
–stickedoverflow '17

3
我和你的情况非常相似。对我有帮助的是转到您的FB页面-设置-应用-从列表中删除该应用。更改哈希键并重新安装fb应用和您的应用。现在就可以了...
anna_manzhula

4

这是我解决此问题的方法:

首先,您必须获取SHA-1值。为此,有两种方法。

在Android Studio中获取SHA-1值。

  1. 单击摇篮
  2. 点击签名报告
  3. 复制SHA-1值

要么

密钥库文件获取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

然后打开Hexadecimal-> Base64字符串解码器,将SHA-1值转换为Base64。

这就是Facebook的要求。

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


3

我遇到了同样的问题。首先登录,就可以了,但是之后是无效的密钥哈希。

用于Unity的Facebook SDK获取了错误的密钥哈希。它从“ C:\ Users \“您的用户” .android \ debug.keystore”获取密钥,并且在理想情况下,它应该从您在项目中创建的密钥库获取密钥。这就是为什么它告诉您密钥哈希未注册的原因。

根据Madi的建议,您可以按照此链接上的步骤查找正确的钥匙。只要确保将它们指向项目内的密钥库即可。否则,您将无法获得正确的钥匙。


3

以下代码将为您提供Facebook的哈希,但是您必须按照以下步骤操作才能获取候选发布哈希。

  1. 将此代码复制并粘贴到您的主要活动中

    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) {
    }
  2. 生成签名的APK文件。

  3. 将手机连接至笔记本电脑,并确保其保持连接状态。
  4. 通过手动将发行版APK移动到手机中,在手机中安装并运行APK文件。
  5. 现在查看Android LogCat(使用过滤器KeyHash:)。您应该看到Facebook的发布哈希键。只需将其复制并粘贴到您的计算机中即可https://developers.facebook.com/apps。在设置下。
  6. 现在,您可以测试该应用程序,它应该可以正常运行。

请注意,该代码仅在生成签名的apk时有效。否则,它只会给您调试apk哈希,这对于已发布的apk没用
阿卜杜勒·贾里勒

嗨,当我将生成的哈希密钥提供给facebook应用程序时,它工作正常,但是当尝试在另一台设备上运行时,它再次显示“ INVALID HASH KEY”,我该如何为包含所有设备的工作簿设置哈希密钥。
Deepak

2

经过长时间的研究,我们找到了解决方案。

我们已将权限设置为:

loginButton.setReadPermissions(public_profile email);

这是第一次成功,但是当我们重新登录Facebook时,出现了无效哈希错误

简单的解决方案是将以上行更改为:

loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));

它像幸福一样运作!

Facebook应该返回正确的异常,而不是误导性的无效哈希键错误。


我有同样的问题。我尝试了您的解决方案,但仍然无法解决我的问题@ user3663906
BekaKK


2

尽管这个问题已经有帮助的方式很多已回答我只是想补充的是,当我跟着拉法尔Maleks答案(使用谷歌的哈希键播放控制台)我是能够使用的应用程序签名SHA1关键,还是得到了通用来自Facebook的错误。相反,我需要使用“ 上传证书”部分中的SHA-1证书指纹(位于Google Play控制台上“应用签名”部分的下方)。否则相同的过程;

  1. 从Google Play控制台的“ 上传证书”部分复制SHA-1证书指纹

  2. 使用以下网址转换SHA-1:http : //tomeko.net/online_tools/hex_to_base64.php并复制输出(base64)

  3. 将其粘贴到developer.facebook.com上的“密钥哈希”输入中并保存更改。

希望这个答案不是多余的,并且可以帮助无法使用它的人使用App Signing证书。

现在,Facebook登录可以在我的应用程序中以调试和发布模式运行。


1

将以下代码粘贴到您的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) {
    e.printStackTrace();
}
catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}

只需修改包名称。然后转到您的LogCat文件,然后在此处选择“调试搜索”。然后,您将找到哈希键。现在复制此哈希键,然后转到developer.facebook.app_id站点,编辑您的哈希键,然后按Save。现在再次运行您的Android项目。我认为问题会得到解决。


7
重复另一个家伙
Beto Caldas

1

这可能会帮助遇到相同问题的人。

  1. 使用以下代码生成密钥哈希

    keytool -exportcert -alias <your_keystore> alias -keystore <your_keystore_file> | openssl sha1 -binary | openssl base64

    如何使用键盘工具

  2. 将其粘贴到Facebook开发人员的必填字段中

  3. 在Android Studio中,菜单文件项目结构

    在此处输入图片说明

    添加签名参数。

  4. 选择口味

    在此处输入图片说明

    选择我们创建的签名配置。

  5. 选择构建类型

    在此处输入图片说明

  6. 选择构建变体并进行构建

    在此处输入图片说明


1

我在调试应用程序时遇到了同样的问题。我重写了您在所附图像中划掉的哈希(Facebook认为无效的哈希),并将其添加到Facebook的开发人员控制台中以添加关键哈希值。只是要注意错别字。

与正确的解决方案相比,此解决方案更像是一种简单的解决方法。



1
try {
    PackageInfo info = getPackageManager().getPackageInfo(
                           "www.icognix.infomedia",
                           PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("YourKeyHash: ", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        Log.d("YourKeyHash: ", Base64.encodeToString(md.digest(), Base64.DEFAULT));
    }
}
catch (PackageManager.NameNotFoundException e) {
}
catch (NoSuchAlgorithmException e) {
}

0

Facebook使用的不是用于调试的默认密码和别名。您需要随后对其进行更改,然后它才能工作。

/usr/lib/jvm/jdk1.8.0_66/bin/keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64

如果您没有使用默认密码更改任何内容,则应为“ android”

您也可以在build.gradle文件中对其进行配置。但是应该使用相同的别名密码来生成哈希:

android {
    signingConfigs {
        release {
            storeFile file("~/.android/debug.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
    }
}

0

这里有很多正确的答案。就一件事:

将接收到的哈希粘贴到ApplicationSettingsMain中,而不是通过快速入门教程。


0

我有同样的问题。

确保使用与生成哈希密钥的设备相同的设备来构建APK文件,该设备存储在Facebook开发人员部分中。


0

我通过将以下内容添加到中来解决此问题MainApplication.onCreate

try {
    PackageInfo info = getPackageManager().getPackageInfo(
                           "com.genolingo.genolingo",
                           PackageManager.GET_SIGNATURES);

    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        String hash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
        KeyHash.addKeyHash(hash);
    }
}
catch (PackageManager.NameNotFoundException e) {
    Log.e("PackageInfoError:", "NameNotFoundException");
}
catch (NoSuchAlgorithmException e) {
    Log.e("PackageInfoError:", "NoSuchAlgorithmException");
}

然后,我将其上传到Google开发者控制台,然后下载了派生的 APK,无论出于何种原因,该APK的密钥哈希值都完全不同。

然后,我使用LogCat确定新的密钥哈希值,并将其添加到其他用户概述的Facebook中。


0

如果要生成发布密钥哈希,请确保输入密钥库的实际密码,而不是 “ android”。

这是我的问题。调试版本有效,但APK版本无效。


-1

在您的活动的onCreate()方法中使用以下代码:

try {
    PackageInfo info = getPackageManager().getPackageInfo(
                           "your application package name",
                           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) {
}

运行此代码。这将生成哈希密钥。将此KeyHash复制到Facebook应用程序设置中,然后保存更改。然后登录到您的应用程序。这在将来也将完美运行。


3
重复另一个家伙
Beto Caldas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.