3

我们在 Kindle Fire 安卓应用上集成了 Facebook 登录。它在大多数情况下都可以正常工作。但偶尔对于某些用户来说,当他们尝试使用 facebook 登录进行注册时,它会失败并显示错误“APP 为 facebook 登录配置错误”。我们检查了哈希键、包名和所有这些,它们都是正确的。正如我所说,它适用于 95% 的用户。对于那些失败的用户,它会反复失败。facebook的任何人都可以帮助我们解决这个问题吗?赞赏。(顺便说一句,我们为我们的 google play 版本的 android 应用程序使用相同的 facebook 应用程序,也使用不同的哈希键,我们的 google play 应用程序从未遇到过这个问题。我们从亚马逊获得了 Kindle 的哈希键。)因为它没有在我们的任何设备中失败,并且仅在某些随机用户的设备上失败,我们无法获得任何调试消息。

PS:我已经阅读了帖子App is misconfigured for Facebook login: Android Facebook integration issue。我是新用户,我不能在那里问这个问题。

4

5 回答 5

2

@Blanka 的回答在技术上是正确的,但是我找到了一种更简单的方法:只需转到亚马逊开发者控制台并复制我在红色矩形中突出显示的值:SHA1 基数 64

于 2014-03-21T20:26:03.820 回答
2

我们在亚马逊应用商店中的一款应用也遇到了同样的问题。在我们的案例中,我们意识到只有当这三个条件为真时才会出现问题:

  • Kindle Fire HD
  • Facebook 应用程序已安装且用户已登录
  • 用户还通过设置 -> 我的帐户 -> 管理社交帐户登录了 facebook

这可以解释为什么在你的情况下它只发生在 5% 的情况下。

据我们所知,亚马逊放弃了 .apk,这打破了 Facebook Android App Key Hash 检查。

涉及的解决方案:

  1. 获取我们app的Amazon.apk(不是我们提交的,是亚马逊appstore分发的)
  2. 从 .apk 文件中提取签名证书
  3. Base64 对编码证书的 SHA 摘要进行编码
  4. 将生成的 Base64 密钥哈希添加到我们的 Facebook 应用设置

这解决了问题。

事实证明,获取 .apk 很棘手。应用程序位于设备文件系统的 /data/app 文件夹中。但是,此目录受到保护以防止将其列出,因此除非您知道要查找的文件的名称,否则您就不走运了。当然,您可以根设备。或者,您可以通过adb pull /data/app/<app-id><suffix>.apkwhere suffix is a empty string 或-1,-2等来试试运气,直到成功。例如:

$ adb pull /data/app/com.example.game.apk
remote object '/data/app/com.example.game.apk' does not exist
$ adb pull /data/app/com.example.game-1.apk
remote object '/data/app/com.example.game-1.apk' does not exist
$ adb pull /data/app/com.example.game-2.apk
3658 KB/s (1085140 bytes in 0.289s)

如果这种方法失败,生根可能是唯一的选择。

获得 .apk 文件后,您可以使用下面的代码来获取密钥哈希。另存为Main.java,编译javac Main.java并运行java Main <APK>,例如:

$ javac Main.java
$ java Main com.example.game-1.apk
com.example.game-1.apk: 478uEnKQV+fMQT8Dy4AKvHkYibo=

添加478uEnKQV+fMQT8Dy4AKvHkYibo=到我们的 Facebook 应用程序设置的密钥散列然后解决问题。我很好奇其他人是否找到我们得到的相同哈希(这意味着所有亚马逊游戏都使用相同的密钥退出)。在我们的例子中,哈希以wwYPegrz....

这是代码:

import java.security.MessageDigest;
import java.security.cert.Certificate;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

import sun.misc.BASE64Encoder;

public class Main {
    public static void main(String[] args) throws Exception {
        for (String jarFilename : args)
            extractHash(jarFilename);
    }

    private static void extractHash(String jarFilename) throws Exception {
        BASE64Encoder base64 = new BASE64Encoder();
        MessageDigest sha1 = MessageDigest.getInstance("SHA");
        Set<Certificate> certificates = new HashSet<Certificate>();
        JarFile jarFile = new JarFile(jarFilename);
        for (JarEntry jarEntry : Collections.list(jarFile.entries())) {
            jarFile.getInputStream(jarEntry).skip(Long.MAX_VALUE);
            Certificate[] certs = jarEntry.getCertificates();
            if (certs == null)
                continue;
            certificates.addAll(Arrays.asList(certs));
        }
        System.out.printf("%s:", jarFilename);
        for (Certificate cert : certificates) {
            byte[] digest = sha1.digest(cert.getEncoded());
            System.out.printf(" %s", base64.encode(digest));
        }
        if (certificates.isEmpty())
            System.out.printf(" NOT SIGNED!");
        System.out.println();
        jarFile.close();
    }
}
于 2013-03-13T23:31:14.517 回答
1

Blanka 的解决方案有效。

但是,如果您可以在 Kindle Fire 上重现该问题,那么这里还有一个更容易实现的解决方案。

从 LogCat 中检索 Facebook 发送的身份验证请求:

03-13 15:21:19.360: D/WebCore(26863): *-* Total load time: 1535.31 ms, thread time: 287.00 ms for
https://m.facebook.com/dialog/oauth?android_key=XXXXXXXXXXXXX&calling_package_key=<app_package_id>
&client_id=YYYYYYYYYYYY&display=touch&redirect_uri=fbconnect%3A%2F%2Fsuccess&scope=email%
2Cpublish_stream&type=user_agent&_rdr

android_key参数是Hash Key您的应用程序的。您需要在 Facebook 仪表板上添加此密钥。

注意:请注意,您在 https 请求中的哈希编码格式可能与 Facebook 所需的不同。

于 2013-03-14T14:35:57.330 回答
0

发现了一种在 Kindle 或任何其他设备上处理此问题的更简单方法。如果您安装了 FB 应用程序(在我的情况下,我没有尝试其他登录路径,但也可以工作?),并且您使用的登录名在 developer.facebook.com 的 FB 应用程序中列为开发人员有问题的应用程序,哈希将出现在它在应用程序本身给您的错误消息中。表示“无法识别哈希键 xxxxxxxxxxxxxxxxx。在开发人员门户中管理您的哈希键以获取应用程序 ID yyyyyyyyyyyy”。

抱歉,如果文本不完全正确,我在自己解决问题之前没有截图,但这就是它的要点。

于 2015-04-13T05:02:57.203 回答
0

我认为 hashkey 的问题,我也面临同样的问题。我通过下载的 openssl 和生成的哈希解决了这个问题。尝试以下答案 https://stackoverflow.com/a/14826036/1258999

于 2013-03-14T05:10:43.917 回答