我正在构建一个用户可以使用Facebook登录的应用程序。
我已经创建了如下的哈希键:
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.app.package",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("KeyHash", "KeyHash:"+ Base64.encodeToString(md.digest(),
Base64.DEFAULT));
Toast.makeText(getApplicationContext(), Base64.encodeToString(md.digest(),
Base64.DEFAULT), Toast.LENGTH_LONG).show();
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
在调试模式下,一切正常。
当我导出项目以供发布时,它会出现此错误:
"Invalid key hash. The key hash ****************** does not match any stored key hashes"
我粘贴了Facebook Developer仪表板中打印的密钥,但应用程序仍然给我错误。
我的行为的完整包是“com.app.package.views
”,我尝试在信息中心使用此软件包(作为Google Play套餐名称),但没有任何改变。
我该如何解决?如何生成正确的发布密钥哈希?
答案 0 :(得分:45)
您按照Facebook提供的步骤创建了登录应用程序吗?
你需要一个'制作键盘'获得启动发布密钥库:
从命令行:
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
并在Facebook应用页面选项中添加此密钥。
更多信息:https://developers.facebook.com/docs/android/getting-started/
答案 1 :(得分:33)
我找到了解决方案。对于MAC
使用此来获得YOUR_RELEASE_KEY_ALIAS:
keytool -list -keystore /Users/***/Documents/keystore/***.jks
和这个获得你的发布密钥:
keytool -exportcert -alias YOUR_RELEASE_KEY_ALIAS -keystore /Users/***/Documents/keystore/***.jks | openssl sha1 -binary | openssl base64
它对我有用。
答案 2 :(得分:26)
最简单的解决方案。
1)签署您的Apk。
2)将您的设备连接到计算机并在真实设备上安装已签名的apk。
3)当按下facebook登录时,您将收到一条错误消息&#34;无效的密钥哈希。关键哈希&#34; xxx&#34;与任何存储的密钥都不匹配。 ...&#34;在你的logcat上。
4)复制logcat Hash Key并将此密钥放到developers.facebook.com/apps/104 ..... / settings /
答案 3 :(得分:8)
我们需要更换&#34; openssl&#34;通过openssl结构中的一个文件的路径。
所以,我的CMD命令是:
C:\Program Files\Java\jre1.8.0_45\bin>keytool -exportcert -alias Informatheus -keystore C:\Users\Atendimento\Dropbox\AndroidKeystore\Keystore | C:\Users\Atendimento\Desktop\openssl\bin\openssl sha1 -binary | C:\Users\Atendimento\Desktop\openssl\bin\openssl base64
有效。
答案 4 :(得分:3)
//将此方法添加到您的第一个活动并打开日志并搜索Base64标签这是Hashkey我箍它帮助
public void getHashkey(){
try {
PackageInfo info = getPackageManager().getPackageInfo(getApplicationContext().getPackageName(), PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.i("Base64", Base64.encodeToString(md.digest(),Base64.NO_WRAP));
}
} catch (PackageManager.NameNotFoundException e) {
Log.d("Name not found", e.getMessage(), e);
} catch (NoSuchAlgorithmException e) {
Log.d("Error", e.getMessage(), e);
}
}
答案 5 :(得分:2)
供以后参考,如果您已经在Play商店中拥有自己的应用,则可以:
转到Release Management
在App Signing
中选择Release Management
您可以看到十六进制格式App signing certificate
的SHA1密钥。
以十六进制格式复制SHA1并将其转换为base64格式,您可以使用此link来执行此操作,而无需十六进制的SHA1:
部分。
转到Facebook开发者控制台,并在settings —> basic –> key hashes
中添加密钥(转换为base 64后)。
答案 6 :(得分:1)
Facebook SDK使用两个不同的键,一个是您可以在开发阶段使用的Debug键,另一个是在创建已签名的应用程序包后使用的Release键。 以下是有关如何创建调试和释放密钥的链接。
同时查看this SO帖子。
答案 7 :(得分:0)
获取哈希密钥发布的apk的最简单方法是: 使用以下命令获取已发布的apk的SHA1密钥:
keytool -list -v -keystore keystore_path.jks -alias keystoreAlias
然后您将获得SHA1密钥。复制该密钥并使用以下站点生成哈希密钥:
您将获得Output(base64):将其复制并在需要的地方使用。.
答案 8 :(得分:0)
首先打开命令提示符(Windows + R)
cd C:\ Program Files \ Java \ jre1.8.0_172 \ bin
从HERE
下载openssl在C:/驱动器中创建一个名为OpenSSL的文件夹
将下载的zip文件导出到OpenSSL文件夹中
将命令生成为:-
keytool -exportcert -alias YOUR_ALIAS -keystore“ YOUR_KEYSTORE_PATH” | “ C:\ OpenSSL \ bin \ openssl” sha1 -binary | “ C:\ OpenSSL \ bin \ openssl” base64
将命令粘贴到命令提示符中,然后按Enter键
输入密码
在这里您可以看到密钥:-“ 1skdhyjsgd56whdjddV + vCLE =”
答案 9 :(得分:0)
您必须生成两个密钥哈希。第一个使用上面的命令。
一旦您的应用在 Play 商店中,请转到
Configuration -> app integrity
并获取谷歌生成的 SHA1 并访问此站点:
www.fbkeyhash.com
粘贴 SHA1 并生成第二个 Key Hash。
两者都需要保存在 Facebook 控制台中,才能使您的 APK 的实时版本和调试版本正常工作。
答案 10 :(得分:0)
2021 年 7 月: 在 Google Console 中查找密钥(如果您的应用已发布)
Google Play Consolez
-> 左侧菜单 Release
-> Setup
-> App Integrity
-> Upload key certificate
-> SHA-1 certificate fingerprint
>
将 HEX 转换为 base64: https://base64.guru/converter/encode/hex
在 Facebook 添加密钥:Add your development and release key hashes
答案 11 :(得分:-1)
这是我到目前为止发现的用于生成密钥哈希的最简单方法!
try
{
PackageInfo info = getPackageManager().getPackageInfo(
"Your 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 (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
答案 12 :(得分:-2)
keytool -exportcert -alias aliasName -keystore C:\my_release_keystroke_info.jks | openssl sha1 -binary | openssl base64