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 上,使用 (将 <>
之间的值替换为您的值):
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】:这里有很多正确的答案。只有一件事:
将收到的哈希粘贴到 Application → Settings → Main,而不是通过快速入门教程。
【讨论】:
【参考方案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 4.0.1 无效密钥哈希错误
带有 Cordova 的 Facebook 的 Android 密钥哈希
Phonegap Facebook 插件 - 从 Android 设备中删除应用程序后密钥哈希无效
React Native FBSDK 无效的密钥哈希。 Keyhash 已添加到 developer.facebook 并且应用程序已上线