【问题标题】:Android Facebook integration with invalid key hashAndroid Facebook 与无效密钥哈希的集成
【发布时间】: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)); }
  • 我在这里解决了这个问题!这里明白了酷![stackoverflow.com/questions/5306009/…][1]
  • @Android 虽然这很旧,但我应该提一下。当用户注销然后登录时不会发生这种情况。当您第二次调试时会发生这种情况,即在调试时重新安装应用程序。因此,哈希值发生了变化。这不会发生在签名的应用程序(生产就绪)的情况下
  • 如果您卸载 Facebook 应用程序,您会收到同样的错误吗?我在两部手机上进行了测试,只有在安装 Facebook 应用时才会出现此错误。

标签: android 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 值。

  1. 点击Gradle
  2. 点击签名报告
  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

然后打开 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 部分下方)。其他相同的过程;

  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 登录可以在我的应用程序中以调试和发布模式运行。

【讨论】:

    【解决方案11】:

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

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

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

    【讨论】:

      【解决方案12】:

      以下代码将为您提供 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 是无用的
      • 嗨,当我将生成的 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】:

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

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

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

              How to use keytool

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

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

              添加签名参数。

            4. 选择口味

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

            5. 选择构建类型

            6. 选择构建变体并构建它

            【讨论】:

              【解决方案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,并保存更改。然后登录到您的应用程序。这也将在未来完美运行。

                          【讨论】:

                          • 重复其他人
                          猜你喜欢
                          • 2016-10-31
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2014-09-17
                          • 1970-01-01
                          • 1970-01-01
                          • 2023-03-08
                          相关资源
                          最近更新 更多