Android Facebook集成无效键散列

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

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

截图的无效密钥哈希错误Facebook

我做错了什么?我正在使用Facebook SDK < em > < / em >…我已经在手机上安装了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");
}
246903 次浏览

根据Android版Facebook登录,必须提供键哈希值。为了获得它,你将需要用来签署你的应用程序的关键

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

生成的哈希键错误。您可以通过两个步骤获得哈希键。

一种是通过命令提示符。另一个是通过编码。通过命令提示符的散列键仅在第一次工作。我不知道原因。我也有同样的问题。所以我试着通过编程来实现。

遵循以下步骤:

将以下代码粘贴到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了。 有关key hash的更多详细信息,请检查的链接.

如果你在设置页面中添加了错误的信息,这意味着它会给出一些错误。所以要使用正确的信息。另外,如果公众(除了你)需要使用你的应用程序意味着你需要启用权限(在“Status &”“Review”旁边的设置)

将以下代码粘贴到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文件,在这里选择Debug搜索。然后你会找到哈希键。现在复制这个散列键,然后转到developer。facebook。app_id site,编辑你的散列键,然后按保存。现在再次运行Android项目。我认为问题会得到解决。

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

  • 在一个新的Facebook应用程序的第一次执行期间,它将允许连接/登录,即使你没有指定任何键哈希

  • 对我来说,Facebook提供的教程没有生成正确的键散列,因为它给出了错误的配置。当执行:

    keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl
    base64
    

make sure you check all properties - the HOMEPATH, the existence of the keystore, etc. Maybe you also have to provide password.

  • What generated the proper configuration was the solution suggested by @Mahendran.

  • Also, if you see the error originally posted (http://i.stack.imgur.com/58q3v.png), most probably the key hash you see on the screen is your real one. If nothing else works, try inputting it in Facebook.

I got all those results with: Windows 7 64-bit edition, Android Studio 1.2.2, JDK 7.

在你的活动的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,并保存更改。然后登录到您的应用程序。这在将来也会非常有效。

我也有同样的问题。首先登录,没问题,但接下来,一个无效的键散列。

Unity的Facebook SDK得到了错误的键散列。它从"C:\Users\ your user".android\debug获取键。密钥存储库”,在理想情况下,它应该从您在项目中创建的密钥存储库中获取。这就是为什么它告诉你键哈希没有注册。

根据Madi的建议,你可以按照这个链接上的步骤找到正确的键。只需确保将它们指向项目中的密钥库。否则你就拿不到正确的钥匙。

如果你正面临这个问题,那么将这个键放入你的developer.facebook.com:

Enter image description here

然后确保你的应用在developer.facebook.com上是生活

这个绿色圆圈表示应用程序是活的:

Enter image description here

如果不是,那么按照以下两个步骤让你的应用上线:

步骤1到你的应用→添加联系邮箱并应用Save Changes。

步骤2转到应用审查选项,并确保此切换为是的。我加了一张截图:

Enter image description here

注意:如果你想复制hashkey,检查LogCat中的BlueServiceQueue。

我也有同样的问题。我确信这是由于非常小的错误,是的,它是!

我找到了解决方案:

当在我的计算机中生成< em > < / em >调试哈希密钥时,我输入了我的系统密码。但密码应该是-

Enter keystore password: "android"。 这是我唯一的问题。

-----为了生成< em > < / em >调试密钥哈希,使用这个命令-

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

输入密钥库密码:'android'

-----要生成< em > < / em >发布密钥哈希,使用这个命令-

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

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

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

我们将权限设置为:

loginButton.setReadPermissions(public_profile email);

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

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

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

它的工作就像一种幸福!

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

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

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

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

    如何使用keytool < / p >

  2. Facebook开发者 .

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

    Enter image description here

    .添加签名参数
  4. < p >选择口味

    Enter image description here

    选择我们创建的签名配置

  5. 选择构建类型

    Enter image description here < / p >

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

    Enter image description here < / p >

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

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

如果你没有改变任何默认密码,它应该是“android”

您还可以在构建中配置它。gradle文件。但是生成散列时应该使用相同的别名密码:

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

我尝试了之前所有的答案,没有一个对我的客户有帮助!

然后我的客户想起来他的设备上安装了Facebook应用程序。在他把它取下来之后。登录工作正常。

hashkey已经被更改,我已经用错误中的key替换了Facebook开发者控制台中的旧hashkey(如上所述),并且它可以工作!

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

下面的代码将为您提供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. Generate a signed APK file.

  3. Connect your phone to a laptop and make sure it stays connected.
  4. Install and run the APK file in your phone by manually moving the release APK to your phone.
  5. Now look at Android LogCat (use filter KeyHash:). You should see your release hash key for Facebook. Simply copy and paste it in your https://developers.facebook.com/apps. It's under settings.
  6. Now you can test the app it should work perfectly well.

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

将接收到的散列粘贴到应用程序设置主要,而不是通过快速入门教程。

当我调试我的应用程序时,我也遇到了同样的问题。我重写了你在附件图像中划掉的散列(Facebook说无效的那个),并将它添加到Facebook的开发者控制台的键散列中。只是要注意错别字。

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

如果您正在使用谷歌Play App签名:

在谷歌播放控制台中打开应用程序签名部分,并在App签名证书下获得sha - 1哈希。然后将其转换为Base64,例如使用这个工具:十六进制->Base64字符串解码器

控制台截图

Convert to Base64截图

您必须创建两个键散列,一个用于调试,另一个用于发布。

对于调试键哈希:

在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

调试键哈希源

对于释放键哈希:

在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

释放键哈希源 . bb0释放键哈希源

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

对我来说唯一有效的解决方案是从谷歌卸载OpenSSL程序,然后从Win32/Win64 OpenSSL Installer for Windows下载

它真的像魔法一样有效。

如果你手动输入键散列(例如从手机到Facebook仪表板),请确保区分小L和大写I。

我也有同样的问题。

确保使用生成hashkey(存储在Facebook开发者部分)的相同设备构建APK文件。

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

然后,我将其上传到谷歌开发人员控制台,然后下载了派生的 APK,不管出于什么原因,它具有完全不同的键散列。

然后我使用LogCat来确定新的密钥散列,并将其添加到Facebook,就像其他用户所概述的那样。

我是这样解决这个问题的:

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

在Android Studio中获取SHA-1值。

  1. 单击Gradle
  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

并打开十六进制->Base64字符串解码器将SHA-1值转换为Base64。

这正是Facebook所需要的。

获取生成的散列"********************= & ”;并将密钥哈希复制到Facebook应用程序。

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

如果您正在生成释放密钥散列,请确保您输入了密钥库的实际密码和“android”。

这是我的问题。调试版本正在工作,但是发布APK没有。

尽管这个问题已经回答了很多有用的方法,我只是想补充说,当我遵循Rafal Maleks的答案(使用谷歌Play Console上的哈希键),我是能够使用应用程序签名SHA1密钥,仍然从Facebook得到一般错误。相反,我需要使用来自上传证书部分的SHA-1证书指纹(就在谷歌Play Console上的应用程序签名部分的下面)。否则,同样的过程;

  1. 从谷歌Play Console的Upload certificate 章节复制SHA-1证书指纹

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

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

希望这个答案不是多余的,并将帮助那些不能让它与应用程序签名证书一起工作的人。

现在Facebook登录工作在我的应用程序在调试和发布模式。

我也有同样的问题。 解决这个问题的方法是将屏幕上的散列添加到我的应用程序中

我很遗憾地说,其实我什么都不管用。最后,帮助我的是从谷歌播放控制台获得上传SHA-1证书指纹,并将其转换为base64并将其添加到facebook。如果有人需要帮助,请评论

我看到很多人给出了困难的答案,通过我解决我的问题的答案只是去项目/android文件夹/应用程序使用终端,这是你调试的地方。Keystore文件为

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

复制粘贴这个命令,替换别名,并使用与你的project/android/app/build.gradle中的相同的密码

debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'      <---- alias
keyPassword 'android'           <---- password
}