it-swarm.cn

Android Facebook集成无效密钥哈希

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

我创建了 app ID 。它成功登录,但在注销后,我登录,然后它给了我:

Screenshot of invalid key hash error 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");
}
167
Android

生成哈希键是错误的。您可以使用两个步骤获取哈希键。一个是通过命令提示。另一个是通过编码。哈希键通过命令提示仅在第一次工作。我不知道原因。我也遇到了同样的问题。所以我通过编程方式尝试了。

请遵循以下步骤:

将以下代码粘贴到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应用程序仪表板页面。转到设置并输入下面的图像中的详细信息。

enter image description here

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

如果在设置页面中添加错误信息,则意味着会出现一些错误。所以在那里使用正确的信息。而且,如果公共(除您之外)需要使用您的应用程序,则意味着您需要启用permission(change "yes" in the "Status & Review" next to setting)

258
Mahendran Sakkarai

如果您使用的是Google Play App Signing:

打开应用程序签名部分 Google Play控制台 ,并获取 SHA1 of 应用程序签名证书 ,然后将其转换为 base64 ,例如这个工具: http://tomeko.net/online_tools/hex_to_base64.php?lang=en

console screenshot

convert to base64 screenshot

126
Rafal Malek

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

enter image description here

然后确保您的应用是 live on

developer.facebook.com

此绿色圆圈表示应用已上线

enter image description here

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

步骤1 转到您的应用程序 - > 设置 =>和 添加联系电子邮件 并应用保存更改

Setp 2 然后转到 App Review option并确保此切换为是我添加了一个屏幕截图

enter image description here

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

108
Arpit Patel

我遇到了同样的问题。我确信这是由于非常小的故障,是的,它是!!!!我找到了解决方案。

在我的计算机中生成 debug hash key时,我输入了系统的密码。但是密码应该是以下 -
输入密钥库密码:“Android”
这是我案件中唯一的问题。

-----对于生成 Debug key hash,使用此命令 -

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

输入密钥库密码:'Android'

-----要生成 Release key hash,请使用此命令 -

keytool -exportcert -alias“密钥库的别名”-keystore“签署应用程序时密钥库的路径”| openssl sha1 -binary | openssl base64

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

70
Akash Bisariya

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

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

21
Martin Doychev

根据 Facebook登录Android ,您必须提供Key Hash值。为了获得它,您需要使用 key 来签署您的应用程序。

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

我尝试了上述所有内容,并没有对我的客户有任何帮助!比我的客户记得他在他的设备上安装了Facebook App。删除后,登录工作完美。该hashkey已被更改,我已使用错误中的密钥(如上所述)替换了Facebook开发者控制台上的旧哈希键,并且它可以正常工作! Facebook应用程序本身可能是问题所在,因此您最好在安装了Facebook应用程序的设备上以及未安装Facebook应用程序的设备上解决这个问题并处理这两种情况。

7
Matan Dahan

您必须为Debug创建两个键哈希,为Release释放一个哈希。

对于 Debug key hash:

在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 key hash:

在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

释放键哈希源

6
MBH

我遇到了同样的问题。 首先登录,很好,但是,无效的密钥哈希。

即使这不是一个Unity线程,我在这里找到了答案。所以我会留下我的答案,以防其他人(像我一样误入歧途)偶然发现它。

Facebook SDK for Unity获取错误的密钥哈希。它从“C:\ Users \”获取用户“.Android\debug.keystore”的密钥,并且在一个完美的世界中,它应该从您在项目中创建的密钥库中获取它。这就是为什么它告诉你密钥哈希没有注册。

正如 Madi 所示,您可以按照此 link 上的步骤找到正确的密钥。只需将shure指向项目内的密钥库,否则您将无法获得正确的密钥。

3

此代码将为您提供Facebook的哈希值,但您必须按照这些步骤才能获得发布的condidate哈希值。 1.将此代码复制并粘贴到mainactivity中

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

}
  1. 生成签名的apk。
  2. 将手机连接到笔记本电脑并确保它保持连接状态。
  3. 通过手动将发布apk移动到您的手机上,安装并运行apk。

  4. 现在看看Android logcat(使用过滤器KeyHash :)你应该看到你的facebook版本哈希密钥。只需将其复制并粘贴到您的 https://developers.facebook.com/apps 它的设置下即可。

  5. 现在你可以测试它应该完美运行的应用程序。

    祝好运。

3
abdul jalil

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

我们将权限设置为:

loginButton.setReadPermissions(public_profile email);

这是第一次工作,但是当我们重新登录到FB时,它给出了无效哈希错误。

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

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

它就像幸福一样!

希望这有助于某人。

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

2
user3663906

将以下代码粘贴到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();
}

只需修改包名称。然后转到Log cat并在此处选择Debug search,然后您将找到哈希键。现在复制此哈希键,然后转到developer.facebook.app_id站点,然后编辑您的哈希键,然后按save。现在再次运行您的Android项目我认为问题将得到解决。

1
pavel_coder

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

对我有用的唯一解决方案是从谷歌卸载OpenSSL程序并从 http://slproweb.com/products/Win32OpenSSL.html下载

它真的很像魔术

1
Uchenna Nnodim

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

首先,您必须获得SHA-1值。为此,有两种方法。
- >在Android Studio中获取SHA-1值。

  1. 单击Gradle
  2. 单击“签名报告”
  3. 复制SHA-1值

或 - >从 keystore file获取SHA-1值。

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

像这样CD:A1:EA:A3:5C:5C:68:FB:FA:0A:6B:E5:5A:72:64:DD:26:8D:44:84 SHA1 值复制到剪贴板

并打开 http://tomeko.net/online_tools/hex_to_base64.php 将您的SHA1值转换为base64。
这就是Facebook的要求
获取生成的哈希“******************** =”并将密钥哈希复制到facebook应用程序。

1
Sajid Zeb

如果您手动键入keyhash(例如从Mobile到Facebook Dashboard),请确保区分小L和大写I.

1
Kashif Nazar

我在调试我的应用程序时遇到了同样的问题。我已经重写了你在附加图像中划掉的哈希值(Facebook认为无效的那个),并在Facebook的开发者控制台中将其添加到关键哈希值。在拼写错误时要小心。

这个解决方案更像是简单的解决方案而不是正确的解决方案。

1
Piotr Sagalara

这可能会帮助一些有同样问题的人

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

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

如何使用keytool

2.在 facebook developer 中将其粘贴到必填字段中

3.在Android工作室文件 - >项目结构 enter image description here

添加签名参数

4.选择口味 enter image description here

选择我们创建的签名配置

5.选择构建类型 enter image description here

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

enter image description here

1
CLIFFORD P Y

有同样的问题。确保使用生成存储在facebook开发人员部分中的hashkey的相同设备构建APK。

0
genericname

我通过在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");
        }

然后我将其上传到谷歌开发者控制台,然后下载了 derived APK,无论出于何种原因,它都有一个完全不同的密钥哈希。

然后我使用logcat来确定新的密钥哈希并将其添加到其他用户已经概述的Facebook。

0
Michael

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
abhi shukla
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
ZafarHussain

这里的家伙有很多正确的答案。就一件事。将收到的哈希粘贴到 应用程序 - >设置 - >主要 不通过快速入门教程。

0
Chuck

这对我有用。

在Program Files\Java\jdkX.X.X_XXX\bin文件夹中将APK复制到PC

就我而言,它是C:\ Program Files\Java\jdk1.8.0_191\bin

在此目录中打开CMD并键入以下内容

keytool -list -printcert -jarfile YOUR_APK_NAME.apk

将SHA1值复制到剪贴板它将是这样的:79:D0:E6:80:4E:28:1E:D1:88:28:CB:D7:E6:BE:2E:0C:FB:24:98:52

然后转到 http://tomeko.net/online_tools/hex_to_base64.php 将您的SHA1值转换为base64。

这就是Facebook要求获取生成的哈希“******************** =”并将密钥哈希复制到您的Facebook开发者应用程序设置。

0
Muhammad Ovi