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

Posted

技术标签:

【中文标题】Android Facebook 与无效密钥哈希的集成【英文标题】:Android Facebook integration with invalid key hash 【发布时间】:2014-07-03 15:47:56 【问题描述】:

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

我已经创建了应用 ID。它登录成功,但是注销后,我登录,然后它给了我:

我做错了什么?我正在使用 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");

【问题讨论】:

但如果我在注销后登录,它第一次运行良好,它无法正常工作 是的,我有.. 使用 try PackageInfo info = getPackageManager().getPackageInfo("com.facebook.samples.hellofacebook", PackageManager.GET_SIGNATURES); 创建for (签名签名: info.signatures) MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); 我在这里解决了这个问题!这里明白了酷![***.com/questions/5306009/…][1] @android 虽然这很旧,但我应该提一下。当用户注销然后登录时不会发生这种情况。当您第二次调试时会发生这种情况,即在调试时重新安装应用程序。因此,哈希值发生了变化。这不会发生在签名的应用程序(生产就绪)的情况下 如果您卸载 Facebook 应用程序,您会收到同样的错误吗?我在两部手机上进行了测试,只有在安装 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) 

catch (NoSuchAlgorithmException e) 

在上面的编码中用你的包名修改“com.example.packagename”,不要失败(你可以在Android清单文件中找到你的包名)。

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

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

如果您在设置页面中添加错误的信息,则意味着它会给出一些错误。所以在那里使用正确的信息。此外,如果公众(除了您)需要使用您的应用程序意味着您需要启用权限(在设置旁边的“状态和审查”中更改“是”)

【讨论】:

通过这种方式,您很可能获得了用于调试密钥库的密钥哈希。它在开发模式下适用于您,而不适用于您的生产模式。至少,它不适用于我的生产应用程序。 嘿,这个代码 PackageInfo info = getPackageManager().getPackageInfo("com.example.packagename", PackageManager.GET_SIGNATURES); for (签名签名: info.signatures) MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));当我在 Windows 上以 cmd 运行命令时,发送了一个不同的哈希键,我的哈希键不同,我已在 FB 中添加它,但日志仍然显示程序代码的哈希 我通过桌面上的命令提示符生成了Key Hash并添加到了facebook仪表板,但错误仍然存​​在...... 我有两个疑问。 One: 在我们注意到Key Hash? Two: 之后,我们可以从onCreate 方法中删除上面的代码Key Hash 是否可以在released apps (for apps in playstore) 中工作? 为我节省了很多时间。还是最好的。检查 keyhash 的详细信息并将其复制并粘贴到 facebook 开发人员页面中。不要犯手动输入的错误!此外,请了解每次卸载和安装应用时,keyhash 都会发生变化。【参考方案2】:

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

在 Google Play Console 中打开应用签名部分,并在应用签名证书下获取SHA-1 hash。然后将其转换为Base64,例如使用此工具:Hexadecimal -> base64 string decoder

【讨论】:

谢谢!有用!您也可以使用终端命令:echo YOUR_SHA1_CERTIFICATE_COPIED_FROM_GOOGLE_PLAY | sed s/\://g | xxd -r -p | base64 如果一段时间后你想找出这些哈希的所有键是什么,这对我来说是相反的:echo "hash_from_facebook" | base64 -D | xxd -p | awk 'print toupper($0)' | sed 's/../&:/g;s/:$//' 我需要在 facebook 开发者帐户中添加发布密钥哈希或调试哈希吗? 非常感谢。经过2天的寻找解决方案。这是我没有找到的最佳答案。【参考方案3】:

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

然后确保您的应用在developer.facebook.com上线

这个绿色圆圈表示该应用已上线:

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

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

第 2 步转到 App Review 选项并确保此切换为。我添加了一个截图:

注意:如果要复制hashkey,请查看LogCat中的BlueServiceQueue。

【讨论】:

有没有一种简单的方法可以从手机中复制该哈希? @DanielShatz 它出现在 logcat 中。我一个字一个字地抄了才发现。 @DanielShatz 在 logcat 中查找标签 BlueServiceQueue 这个答案对我有用。在尝试手动输入哈希后,它给了我同样的错误,问题是,我输入了大写 i“I”而不是小写 L“l”。我花了一些时间才意识到这一点。 这是有效的,但我想知道 FB 从哪里得到这个哈希键?没有人想知道吗?该错误显示了正常工作的哈希密钥,但即使使用所有命令,或者从谷歌应用签名获取 sha1 到 base64,也给了我 FB 在错误中显示的密钥......无论如何感谢你的技巧【参考方案4】:

我遇到了同样的问题。我确信这是由于非常小的故障,是的!

我找到了解决办法:

在我的计算机中生成 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

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

【讨论】:

使用“android”作为密码对我有用。这令人费解。 在生成哈希键时使用这个“android”作为密码。 在 windows 机器上,确保为 openssl\bin 和 java..\bin 文件夹正确设置了路径变量。还要设置 HOMEPATH 变量以便能够使用来自 facebook 的命令。 至少在 mac 上我必须安装 Java JDK 才能让它工作。否则上面的调试命令仍然会生成一个哈希,但是这个哈希不起作用并且不会提示您输入密码。安装 JDK 后,这就像一个魅力。 不再工作了。已经用安卓密码尝试了多次.. fb 仍然抱怨【参考方案5】:

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

在第一次执行新的 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。

【讨论】:

linux 版本:` keytool -exportcert -alias androiddebugkey -keystore $HOME/.android/debug.keystore | openssl sha1 -二进制 | openssl base64` 只需在设备屏幕上输入 facebook 显示的内容,就可以了。感谢@Martin 的留言【参考方案6】:

根据Facebook Login for Android,您必须提供密钥哈希值。为了获得它,您将需要用于签署您的应用程序的key。

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

【讨论】:

只想添加评论,使用您的生产密钥库。 @Liangjun 其实你应该使用所有的密钥,否则你将无法在调试环境中测试 Facbeook Login。 @Pius,是的,我实际上使用了两个键。我应该说清楚的。 我收到此命令的错误(不存在 Java 运行时,请求安装。)但仍然得到一个密钥,但是无效,我只是从 logcat 复制粘贴一个告诉我无法识别的密钥.【参考方案7】:

这就是我解决这个问题的方法:

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

在 Android Studio 中获取 SHA-1 值。

    点击Gradle 点击签名报告 复制 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

然后打开 Hexadecimal -> Base64 string decoder 将您的 SHA-1 值转换为 Base64。

这是 Facebook 的要求。

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

【讨论】:

这个答案对我有用【参考方案8】:

您必须创建两个密钥哈希,一个用于调试,一个用于发布。

对于 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

对于Release键散列:

在 OS X 上,运行 (将 <> 之间的值替换为您的值)

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

在 Windows 上,使用 (将 &lt;&gt; 之间的值替换为您的值)

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

Release key hashes source

【讨论】:

我收到此命令的错误(不存在 Java 运行时,请求安装。)但仍然得到一个密钥,但是它是无效的,为了使其工作,我只需从 logcat 复制粘贴一个跨度> 也许你没有在命令行中设置你的java和keytool的PATH? @CristiBăluță【参考方案9】:

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

然后我的客户记得他的设备上安装了 Facebook 应用程序。在他删除之后。登录效果很好。

哈希键已更改,我已将 Facebook 开发者控制台中的旧哈希键替换为错误中的密钥(如上所示),它可以正常工作!

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

【讨论】:

是的,我在设备上安装 facebook 应用程序后出现此错误。所以目前我在 Facebook 开发设置上放了 2 个哈希键。 我的情况和你很相似。对我有帮助的是转到您的 FB 页面 - 设置 - 应用程序 - 从列表中删除该应用程序。更改哈希键并重新安装 fb 应用程序和您的应用程序。现在它可以工作了......【参考方案10】:

尽管这个问题已经以很多有用的方式得到了回答,但我只是想补充一点,当我按照 Rafal Maleks 的回答(使用 Google Play 控制台上的哈希键)时,我能够使用App Signing SHA1 密钥,仍然从 Facebook 得到一般错误。相反,我需要使用 Upload Certificate 部分中的 SHA-1 证书指纹(就在 Google Play Console 上的 App Signing 部分下方)。其他相同的过程;

    从 Google Play 管理中心的上传证书部分复制 SHA-1 证书指纹

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

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

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

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

【讨论】:

【参考方案11】:

我遇到了同样的问题。 先登录,没问题,但随后出现无效的密钥哈希。

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

按照Madi 的建议,您可以按照this link 的步骤找到正确的密钥。只需确保将它们指向项目中的密钥库即可。否则您将无法获得正确的密钥。

【讨论】:

【参考方案12】:

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

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

    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) 
    
    

    生成签名的APK 文件。

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

【讨论】:

请注意,该代码仅在您生成签名 apk 时才有效。否则它只会给你调试 apk 哈希,这对于发布的 apk 是无用的 嗨,当我将生成的 hashkey 提供给 facebook 应用程序时,它工作正常,但是当尝试在另一台设备上运行时,它再次显示“INVALID HASH KEY”如何设置 Facebook 包含的哈希键适用于所有设备。【参考方案13】:

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

我们已将权限设置为:

loginButton.setReadPermissions(public_profile email);

这是第一次工作,但是当我们重新登录 Facebook 时,它给出了 Invalid Hash Error

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

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

它的工作就像一个幸福!

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

【讨论】:

我有同样的问题。我尝试了你的解决方案,但仍然无法解决我的问题@user3663906【参考方案14】:

经过这么多试验,我偶然发现了一个解决方案。我生成并添加了调试和发布密钥到 Facebook 开发者控制台,但仍然出现错误。

对我有用的唯一解决方案是从 Google 卸载 OpenSSL 程序并从 Win32/Win64 OpenSSL Installer for Windows

下载

它真的很神奇。

【讨论】:

【参考方案15】:

如果您手动键入 keyhash(例如从移动设备到 Facebook 仪表板),请确保区分小 L 和大写 I。

【讨论】:

【参考方案16】:
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) 

【讨论】:

【参考方案17】:

将以下代码粘贴到您的 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 项目。我认为问题将得到解决。

【讨论】:

重复其他人【参考方案18】:

这可能会对遇到同样问题的人有所帮助。

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

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

    How to use keytool

    将其粘贴到Facebook developer的必填字段中

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

    添加签名参数。

    选择口味

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

    选择构建类型

    选择构建变体并构建它

【讨论】:

【参考方案19】:

我在调试我的应用程序时遇到了同样的问题。我已经重写了您在所附图像中划掉的哈希(Facebook 所说的无效),并将其添加到 Facebook 的开发人员控制台中的密钥哈希中。只是要小心错别字。

这个解决方案更像是一个简单的解决方法,而不是一个合适的解决方案。

【讨论】:

【参考方案20】:

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"
        
    

【讨论】:

【参考方案21】:

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

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

【讨论】:

【参考方案22】:

我遇到了同样的问题。

确保您使用生成存储在 Facebook 开发人员部分中的 hashkey 的同一设备构建 APK 文件。

【讨论】:

【参考方案23】:

我通过在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,无论出于何种原因,它都有一个完全不同的密钥哈希。

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

【讨论】:

【参考方案24】:

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

这是我的问题。调试版本正常工作,但发行版 APK 不工作。

【讨论】:

【参考方案25】:

在您的活动的 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) 

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

【讨论】:

重复其他人

以上是关于Android Facebook 与无效密钥哈希的集成的主要内容,如果未能解决你的问题,请参考以下文章

无效的密钥哈希 - android facebook

Android Facebook 4.0.1 无效密钥哈希错误

带有 Cordova 的 Facebook 的 Android 密钥哈希

Phonegap Facebook 插件 - 从 Android 设备中删除应用程序后密钥哈希无效

Cordova facebook 插件无效的密钥哈希

React Native FBSDK 无效的密钥哈希。 Keyhash 已添加到 developer.facebook 并且应用程序已上线