77

我已将我的应用程序与 Facebook 集成,为此我使用 Facebook 的Graph API。我正在检索个人资料和朋友信息。它在我的装有Android 2.3 (Gingerbread) 的设备上运行良好,但最近我的客户在尝试通过我的应用程序连接到 Facebook 时遇到了问题。他的设备上有Android 4.0(冰淇淋三明治)。当他点击应用程序上的按钮进入 Facebook 登录屏幕时,登录后他会收到一条消息:

我的应用程序为 Facebook 登录配置错误。按确定返回应用程序而不连接到 Facebook。

脸书错误信息

我不知道是什么问题与Android版本或什么有关。

我该如何解决这个问题?

4

18 回答 18

90

我在 Facebook 工作,这是一个需要解决的重要问题。这个问题的另一个答案表明禁用 SSO 非常糟糕,并且会将您的应用程序打开给可以窃取您用户的 Facebook 凭据的恶意应用程序。

黑客在没有 SSO 的情况下向 Facebook 启动了一个 WebView 对话框,用户必须在该对话框中输入他们的登录凭据。然后,恶意应用程序可以轻松窃取此信息。始终建议正确实施 Facebook SSO,以确保您的应用安全并保护用户的敏感数据。

在添加此错误消息之前,对话框将自动关闭而不发出警告并静默失败。我们添加了此错误消息,以直观地显示您的 Facebook 应用仪表板中的应用配置存在问题。对于 Android,如果您检查LogCat,您会看到在按下“确定”后,应该会出现一条错误消息,其中将显示导致身份验证失败的更技术性描述。

例如,如果您使用我们的 Hackbook 示例并且没有在源代码中提供您自己的 APP_ID 并且没有将哈希键添加到仪表板,则在本地 SSO 对话框中按“确定”后,您将在 LogCat 中看到此错误(如果Util.ENABLE_LOG 设置为 true):

D/Facebook-authorize(24739):登录失败:invalid_key:Android 密钥不匹配。您的密钥“uk3udeH7vrOGNFH2FJjdJbdWJWI”与您的应用程序设置中指定的允许密钥不匹配。在http://www.facebook.com/developers检查您的应用程序设置

我们添加了视觉错误消息来帮助您。从理论上讲,如果从. 如果您看到此错误消息,则表示您未在仪表板上正确配置应用程序设置。
仔细检查您的 Android 类/包名称、Android 哈希键等。如果您正确执行所有操作,您将不会看到此消息。

总之,您收到该错误消息是因为您的应用配置存在问题,例如,仪表板中的 Android 哈希键不匹配。在 Facebook 添加此错误消息之前,对话框会启动,然后自动关闭并失败。要解决此问题,请检查您的 LogCat 是否有任何错误消息,并确保您已正确实施所有内容。您可以阅读我们的文档以确保一切正确。不要对这个问题使用公认的答案。

您还可以关注 Facebook 开发人员报告的外部错误报告以获取更多更新。

于 2012-09-15T02:01:49.123 回答
15

尝试这样设置:

首先下载OpenSSL(如果你有 64 位机器,你必须下载openssl-0.9.8e X64,而不是最新版本, openssl-0.9.8k X64,因为输出将无效)。提取您的文件,创建文件夹openssl,例如在 C:/ 中并在那里复制文件。

找到你的 keyto 路径。我的是 C:\Program Files\Java\jdk1.7.0_05\bin。

找到通往debug.keystore. 如果您在 Eclipse 中打开菜单Window -> Preferences -> Android -> Build,您可以看到路径是什么,您将看到Default Debug keystore: - 和路径。

找到通往openssl. 我的是 C:\openssl8e\bin/。

打开cmd并输入:

"C:\Program Files\Java\jdk1.7.0_05\bin\keytool" -exportcert -alias androiddebugkey -keystore "C:\Users\User.android\debug.keystore" | "C:\openssl8e\bin\openssl" sha1 -binary | "C:\openssl8e\bin\openssl" base64

A 然后按Enter

输入密码:android

您将获得debug.keystore.

当您导出签名的APK并为应用程序创建密钥库时,只需将 cmd debugkeystore alias 替换为您的应用程序别名,将密钥库路径替换为您为应用程序新创建的密钥库的路径,然后插入您的密码app.keystore,您将获得一个新的已签名应用程序的哈希密钥。

于 2012-09-23T14:24:04.333 回答
12

Jesse Chen的回答很好。Facebooks SDK 工作正常,不要破坏它。

我再次遇到了这个问题,发现 Facebook SDK 文档已更正,现在非常好。现在指导如何调试和释放可以设置的哈希键;照它说的做。

下面是我的老故事。缺少您可以设置两个哈希键,一个用于调试,一个用于为旧的Play Store签名、发布的应用程序。


我发现问题出我的 Facebook SDK 文档中。它指导我们使用调试密钥哈希并将其放入 Facebook 的应用程序配置中。哈希被引导以这种方式获得:

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

当您从Eclipse调试或运行应用程序时,这可以正常工作。

但是,如果您将应用程序发布到 Andoid Play,您必须使用自己的发布者密钥来导出签名的 .apk 文件。使用该 .apk,Facebook 应用程序控制台中的哈希不再有效!您必须像这样获取开发人员密钥的哈希:

keytool -exportcert -alias <developer alias> -keystore ~/.android/<developer keystore> | openssl sha1 -binary | openssl base64

并将其放入 Facebook 应用程序控制台中的 Android Key Hash 中,以供您发布的应用程序使用。之后,SSO 再次为您签名的 .apk 文件正常工作。

于 2012-09-24T20:09:15.003 回答
8

据我所知,这是一个 Facebook 问题,并且已被报告。但是,问题仍然存在。

解决此问题的一种方法(在 2.3.3 上测试)是破解 Facebook SDK,搜索 2 个授权方法并将DEFAULT_AUTH_ACTIVITY_CODE更改为FORCE_DIALOG_AUTH。这将禁用单点登录功能。

如果你喜欢

public void authorize(Activity activity, String[] permissions,
            int activityCode, final DialogListener listener) 

并禁用startSingleSignOn部分。最好不要这样做,因为最终 Facebook 会解决问题,而您只需将旧常量放回原处。

编辑

该解决方案引发了安全问题。检查杰西陈的答案。

于 2012-09-12T16:34:00.500 回答
5

我遇到了同样的问题,在花了 24 小时和大量搜索之后,我们使用这种方法来解决我的问题。

  1. 检查您的 Xcode 项目当前包标识符,例如:com.yourcompanyname.yourappname

  2. 使用相同的 com.yourcompanyname.yourappname 包标识符在 Facebook 中创建应用程序,请参阅附件。

在此处输入图像描述

于 2012-12-21T05:02:32.733 回答
3

几分钟前我自己在 4.0.4 上遇到了这个问题,它似乎已经解决了。

于 2012-09-12T13:03:52.563 回答
3

虽然晚了,但仍然有用:*这是 corerct 的做法(对于调试密钥,请相应更改以发布): *

keytool -exportcert -alias androiddebugkey -keystore "C:\Users\<User>\.android\debug.keystore" > <Drive letter>:\debug.txt
openssl sha1 -binary "<Drive letter>:\debug.txt" > "<Drive letter>:\debug_sha.txt"
openssl base64 -in "<Drive letter>:\debug_sha.txt" > "<Drive letter>:\debug_base64.txt"

哈希在最后生成的文件中:debug_base64.txt....打开它并复制哈希。

请记住用您选择的用户名和驱动器号替换“”

于 2013-01-24T04:05:09.727 回答
2

当您创建密钥散列时,您最终可能会得到末尾带有等号“=”的内容,例如ga0RGNYHvNM5d0SLGQfpQWAPGJ8=。虽然 Facebook 很乐意接受等号作为密钥哈希的一部分,但您必须删除它才能使其正常工作。

此外,请查看Android Facebook SDK 3.0 接受的答案,在登录时给出“remote_app_id 与存储的 id 不匹配”:获取调试密钥库的密钥哈希时,使用密码“android”。否则,密钥哈希将不正确,您将收到问题中指定的错误(如果对您有帮助,请友好并在那里投票。)

于 2012-12-27T10:48:05.347 回答
1

通过确保我拥有正确的发布版本的哈希密钥,我设法解决了我在 Android 上为 Facebook 配置错误的问题。

要获取发布版本哈希密钥,请找到您用于签署应用程序的密钥并执行以下操作,插入您的密钥库别名的名称(不带括号)。如果您不知道您的别名,可以通过将您的应用导出为已签名的应用来找到此别名,别名位于向导的第二页。还要插入密钥库的路径(不带括号)。

keytool -exportcert -alias [Alias of your keystore] -keystore [Path to keystore] | openssl sha1 -binary | openssl base64
于 2012-09-20T13:34:07.797 回答
1

关于使用 OWN keystore 签名的应用程序: 花了几个小时解决了这个问题,我终于明白了,想为那些还在受苦的人提供一个答案:

我的步骤:我通过 eclipse 使用自己的密钥库文件(不是 debug.keystore)签署了我的应用程序。通过命令行和已知命令(keytool -exportcert -alias -keystore ~/.android/ | openssl sha1 -binary | openssl base64)我成功地收到了密钥哈希。将密钥哈希粘贴到开发仪表板中,等待几分钟 -> 仍然是相同的错误(如上述问题中所述)。我在几个 jdks 上尝试了几个不同的 keytools,等等......没有任何改变。

解决方案:我在 manifest 中打开 debuggable,在 facebook sdk 中打开 debuggable。然后我用自己的密钥库签署了 apk 并将其上传到真实设备上。我通过 USB 连接设备并打开 DDMS 透视图以查看设备上的 logcat。
我启动了我的应用程序并让错误消息出现。它打印出与 keytool 生成的密钥完全不同的密钥。我从 logcat 中获取了此密钥,将其粘贴到开发仪表板和瞧 -> 一切正常

我仍然不知道为什么会发生这种情况或导致错误密钥的原因,但这种方式对我有用。

于 2012-10-05T00:15:30.320 回答
1

在像 ubuntu 这样的 Debian 系统上,使用在目录keytool下 找到的 of并像这样生成java/usr/lib/jvm/jdk*.*.*/bin/keytool

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

通过这种方式,您可以获得真实的哈希密钥,该密钥可以放在您的 Facebook 应用哈希下。

于 2012-12-16T09:08:07.470 回答
1

通常这个问题可以通过两个检查来解决:

  • 在 facebook 控制台中标记以实时发布 facebook 配置
  • api 键不匹配
于 2015-01-13T14:52:00.183 回答
0

我做了一个Toast异常,发现它今天抛出了一个键不匹配异常,在FB应用程序页面中添加了键,它工作正常

于 2012-09-13T07:41:13.147 回答
0

几天前我遇到了同样的错误。就我而言,这是由于 Android 密钥不匹配造成的。如果它对您也有帮助,这是我修复它的方法:

在 Facebook SDK 中打开 Util.java,设置private static boolean ENABLE_LOG = true;. 现在运行您的应用程序并输入您的电子邮件 ID 和密码。如果密钥不匹配,Facebook 会发回签名。您将在LogCat中找到此密钥(签名) 。只需复制此密钥并将其粘贴到应用仪表板中即可。那应该可以解决问题。记得设置private static boolean ENABLE_LOG = true;回false。

于 2012-09-23T14:42:43.537 回答
0

也遇到了这个问题。

只需在此处转到 Facebook 开发人员入门页面

并按照步骤 4 - 命令行的事情。

为我工作。

享受。

于 2012-10-26T20:54:11.803 回答
0

我只是遇到了同样的问题,结果证明解决方案非常简单。当我在仪表板中创建应用程序时,我只添加了 android 调试密钥库的密钥哈希。在这种情况下,如果您通过 USB 电缆以开发人员身份安装应用程序,这一切都可以正常工作。

在 Play 商店中拥有应用程序后,您将使用生产密钥对应用程序进行签名。这也意味着,您必须像调试密钥一样获取生产密钥的密钥哈希,并将其作为第二个哈希添加到本机应用程序哈希列表中。

只是为了记住密钥哈希的工作原理:keytool -exportcert -alias -keystore ~/keys/android_keystore | openssl sha1 -二进制 | openssl base64

希望有帮助!

于 2012-10-31T08:13:25.940 回答
0

我有类似的问题,但对于 iOS。

解决方案是在 Facebook 开发人员仪表板上配置 Facebook 应用程序。

对于 iOS,必须做两件事:

  1. 启用 Facebook 登录

  2. Bundle ID 必须与应用相同

于 2012-12-12T00:56:40.367 回答
0

这是一个密钥库问题。配置您的 Eclipse 以使用为其配置应用程序的相同密钥库。

于 2012-12-17T06:52:27.147 回答