Android Facebook集成无效密钥哈希

时间:2014-05-15 09:22:10

标签: android facebook

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

我创建了应用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");
}

26 个答案:

答案 0 :(得分:259)

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

请按照以下步骤操作:

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

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

答案 1 :(得分:131)

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

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

console screenshot

convert to base64 screenshot

答案 2 :(得分:109)

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

enter image description here

然后确保您的应用

实时

developer.facebook.com

此绿色圆圈表示应用已投放

enter image description here

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

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

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

enter image description here

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

答案 3 :(得分:70)

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

在我的计算机中生成 debug 哈希密钥时,我输入了系统密码。但密码应为以下内容 -
输入密钥库密码:&#34; android&#34;
这是我个案中唯一的问题。

-----要生成 Debug 键哈希,请使用此命令 -

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

输入密钥库密码:&#39; android&#39;

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

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

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

答案 4 :(得分:21)

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

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

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

    function checkLocation() {
        //geolocation API options
        var options =  {
            maximumAge: 5 * 60 * 1000,
            enableHighAccuracy: true,
            timeout: 20000};
        //success getting the geolocation
        function success(ppos) {
            lat = ppos.coords.latitude;
            lng = ppos.coords.longitude;
            codeLatLng(lat, lng);
        }
        //error when getting the geolocation 
        function error(err) {
            var errorMessage = "Error:";
            switch(err.code) {
                case err.TIMEOUT:
                errorMessage = 'Error: Attempts to retrieve location timed out.';
                break;
                case err.POSITION_UNAVAILABLE:
                errorMessage = "Error: Your browser doesn't know where you are.";
                break;
                case err.PERMISSION_DENIED:
                errorMessage = 'Error: You have to give us permission!';
                break;
                case err.UNKNOWN_ERROR:
                errorMessage = 'Error: Unknown error returned.';
                break;
                default:
                errorMessage = 'Error: ' + err + ' ' + err.code;
            }
        }
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(success, error, options);
        }
    }
    
    function codeLatLng(lat, lng) {
        var lat = parseFloat(lat);
        var lng = parseFloat(lng);
        var latlng = new google.maps.LatLng(lat, lng);
        geocoder.geocode({'latLng': latlng}, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (results[1]) {
                    return results[1].formatted_address;
                } else {
                    alert('No results found');
                }
            } else {
                alert('Geocoder failed due to: ' + status);
            }
        });
    }
    

确保检查所有属性 - keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64 ,密钥库的存在等。也许您还必须提供密码。

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

  • 此外,如果您看到最初发布的错误(http://i.stack.imgur.com/58q3v.png),则很可能您在屏幕上看到的密钥哈希是真实的。如果没有其他工作,尝试在Facebook上输入它。

我得到了所有这些结果:Windows 7 64位版本,Android Studio 1.2.2,JDK 7.

答案 5 :(得分:12)

根据Facebook Login for Android,您必须提供Key Hash值。要获得它,您需要使用key来签署您的申请。

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

答案 6 :(得分:7)

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

答案 7 :(得分:6)

您必须为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

Debug key hashes source

对于发布密钥哈希:

在OS X上,运行:(在&lt;&gt;之间替换您的值)

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

答案 8 :(得分:3)

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

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

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

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

答案 9 :(得分: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. 现在你可以测试它应该能够很好地运行的应用程序。

    祝你好运。

答案 10 :(得分:2)

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

我们将权限设置为:

  

loginButton.setReadPermissions(public_profile email);

这是第一次使用,但是当我们重新登录到FB时,它会产生无效的哈希错误。

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

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

它就像幸福一样!

希望这有助于某人。

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

答案 11 :(得分:1)

即使以多种有用的方式回答了这个问题,我只是想补充一点,当我按照Rafal Maleks的回答(使用Google Play控制台上的哈希键)时,我不能使用App Signing SHA1密钥仍然从Facebook收到一般错误。相反,我需要使用上传证书部分中的SHA-1证书指纹(位于Google Play控制台上“应用签名”部分的下方)。否则相同的过程;

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

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

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

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

现在,Facebook登录在调试和发布模式下均可在我的应用程序中使用。

答案 12 :(得分:1)

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

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

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

或 ->要从 keystore 文件获取SHA-1值。

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

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

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

答案 13 :(得分:1)

如果您正在手动键入密钥哈希(例如,从Mobile到Facebook Dashboard),请确保区分小写L和大写字母I。

答案 14 :(得分:1)

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

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

它真的像魔术一样

答案 15 :(得分:1)

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

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

答案 16 :(得分:1)

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

  1. 使用以下代码生成密钥哈希
  2. 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 File-&gt; Project Structure enter image description here

    添加签名参数

    4.选择口味 enter image description here

    选择我们创建的签名配置

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

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

    enter image description here

答案 17 :(得分: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();
}

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

答案 18 :(得分:0)

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

答案 19 :(得分:0)

facebook使用的不是默认密码和调试别名。你需要改变它,它会起作用。

div = tree.xpath("//*[@id='ANALYSIS']")[0]

如果您没有使用默认密码更改任何内容,则应该是android。 您也可以在build.gradle文件中对其进行配置。但是应该使用相同的别名密码来生成哈希。

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

答案 20 :(得分:0)

有同样的问题。 确保您使用生成存储在Facebook开发人员部分中的哈希键的设备来构建APK。

答案 21 :(得分: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。

答案 22 :(得分:0)

这对我有用。

将APK复制到Program Files \ java \ jdkX.X.X_XXX \ bin文件夹中的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开发人员应用设置。

答案 23 :(得分:0)

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

        }

答案 24 :(得分:0)

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

这是我的问题。调试版本可以正常工作,但APK版本却无法正常工作。

答案 25 :(得分:-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) {

}

运行此代码,这将生成Hash密钥。在Facebook应用程序设置中复制此KeyHash - &gt;保存更改。然后登录您的应用程序。这也将在未来完美运作。