Android中的Facebooklogin时,键哈希不匹配

我的应用程序使用简单的Facebooklogin。 我在我的应用仪表板key_hash部分input了keyhash,并且能够成功login。 现在我已经发布了应用程序,并试图login,但它显示了一个WebView的错误消息说

"Invalid android_key parameter. The key rX6qeRitkFCWui3de74rxB_qc1s does not match any allowed key. Configure your app key hashes at http://developers.facebook.com/apps/<my_fb_app_id>". 

其实rX6qeRitkFCWui3de74rxB_qc1s不是我在本机应用程序中的关键散列。 它从哪里来? 反正我也进入这个keyhash本地应用程序,但得到相同的错误信息,无法login仍然。 我哪里去错了? 请帮帮我。

Solutions Collecting From Web of "Android中的Facebooklogin时,键哈希不匹配"

你可以通过编码生成一个哈希键,你只需要做一件事。 将这段代码粘贴到主类(第一类)中,然后运行应用程序并检查logcat,在那里您将find散列键。

还有一件事,用你的包名replace这个包名“com.example.creeper”:

 try{ PackageInfo info = getPackageManager().getPackageInfo( "com.example.creeper", 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) { } 

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

在这里输入图像说明

然后确保您的应用程序在developer.facebook.com上正常运行

这个绿色的圆圈表示该应用程序正在运行 在这里输入图像说明

如果不是,那么请按照这两个步骤让您的应用程序生活

步骤1转到您的应用程序 – >设置并添加联系人电子邮件,然后应用保存更改

Setp 2然后转到状态和审查选项,并确保这个切换是的我添加了一个屏幕截图

在这里输入图像说明

尝试使用用于签署已发布应用程序的应用程序的密钥库文件来生成新的keyhash。 这个问题可能是由你的debugging密钥库生成的keyhash造成的,它只能和未签名的apk文件一起工作。 请参阅以下链接的第5步以了解如何生成keyhash https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

并更新与facebook的应用程序设置页面相同。

同时检查你的包名和类名是否正确。

使用debugging密钥存储包括android.deroid文件夹中存在的debug.keystore会产生一个奇怪的问题; 在Android应用程序login使用Facebookloginbutton会发生完美的第一次所需的。 但是,当我注销并尝试login时,它会抛出一个错误说:这个应用程序没有configurationAndroid密钥散列。 请转到http:// ….

使用keytool命令创build密钥库(keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -sigalg SHA1withRSA -keysize 2048 -validity 10000)并将此密钥库放在我的项目最上面的父文件夹中,并制作一个在项目build.gradle文件中input以下问题解决了问题:

  signingConfigs { release { storeFile file("my-release-key.keystore") storePassword "passpass" keyAlias "alias_name" keyPassword "passpass" } } 

请注意,您总是在android活动的onCreate()中使用以下方法来获取关键哈希值(以在您的应用的developer.facebook.com网站中注册)而不是使用命令行(keytool -exportcert -alias -keystore | openssl sha1 -binary | openssl base64)生成哈希值作为命令行在一些封装可能会出错钥匙哈希:

  public void showHashKey(Context context) { try { PackageInfo info = context.getPackageManager().getPackageInfo("com.superreceptionist", PackageManager.GET_SIGNATURES); for (android.content.pm.Signature signature : info.signatures) { MessageDigest md = MessageDigest.getInstance("SHA"); md.update(signature.toByteArray()); String sign=Base64.encodeToString(md.digest(), Base64.DEFAULT); Log.e("KeyHash:", sign); // Toast.makeText(getApplicationContext(),sign, Toast.LENGTH_LONG).show(); } Log.d("KeyHash:", "****------------***"); } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } 

你需要从你的debug.keystore中获得一个keyhash,或者如果你用release key来签名的话,那么你就需要这个keyhash。 确保你的别名也是正确的。 这对你的keyhash有影响。

检查了这一点: 如何创build一个Facebook密钥哈希?

例如,在错误中提供的密钥是"rX6qeRitkFCWui3de74rxB_qc1s" ,那么在Facebook中的哈希码列表,你试着把这个代码放在结尾"="得到rX6qeRitkFCWui3de74rxB_qc1s= ,看看它是否工作。

尝试生成新的密钥散列,并在Facebook开发人员编辑它,并再次注册新的密钥散列的应用程序。

这里是C#版本的任何人试图让Xamarin示例工作的好处。

  public void showHashKey(Context context) { try { PackageInfo info = context.PackageManager.GetPackageInfo("com.facebook.samples.hellofacebook", PackageInfoFlags.Signatures); foreach (Android.Content.PM.Signature signature in info.Signatures) { MessageDigest md = MessageDigest.GetInstance("SHA"); md.Update(signature.ToByteArray()); var sign = Base64.EncodeToString(md.Digest(), Base64Flags.Default); Log.Info("KeyHash:", sign); } Log..Info("KeyHash:", "****------------***"); } catch (PackageManager.NameNotFoundException e) { e.PrintStackTrace(); } catch (NoSuchAlgorithmException e) { e.PrintStackTrace(); } } 

对我来说,当我运行keytool命令,并提示我input密码时,我将其解释为意味着我需要为散列select一个密码。 实际上,您需要将密码提供给密钥库(保存哈希的位置)。 有趣的是(不好笑,“哈哈”),它会接受任何密码,并输出一个哈希给你。 这使我的哈希不匹配。 幸运的是,我很久以前就把密码存储在了OS X钥匙串中,所以我发现它真的是这样。 我尝试了正确的密码,并得到了不同的哈希工作。 请注意,默认的密钥库密码是android ,所以试试看,这可能是你缺less的。

我真的认为一个不正确的密码应该拒绝你,而不是输出一个散列,我不知道这是否是一个错误 – 如果是这样,请留下一个错误报告链接的评论。