Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 登录失败Facebook SDK出现无效密钥错误_Android_Facebook - Fatal编程技术网

Android 登录失败Facebook SDK出现无效密钥错误

Android 登录失败Facebook SDK出现无效密钥错误,android,facebook,Android,Facebook,在设备上运行时,我在Facebook Android SDK中遇到“登录失败错误”。我已经完成了他们指定的一切,比如创建散列等等 错误是: Facebook授权(5539):登录失败:密钥无效 facebook错误:com.facebook.android.facebook错误:无效的\u密钥 如果设备上安装了Facebook应用程序,将引发所述错误 卸载现有Facebook应用程序并运行该应用程序;它运行良好。这是一个SDK问题。只是在同一个问题上花了几个小时 导出密钥的哈希值时,请确保指定正

在设备上运行时,我在Facebook Android SDK中遇到“登录失败错误”。我已经完成了他们指定的一切,比如创建散列等等

错误是:

Facebook授权(5539):登录失败:密钥无效 facebook错误:com.facebook.android.facebook错误:无效的\u密钥


如果设备上安装了Facebook应用程序,将引发所述错误


卸载现有Facebook应用程序并运行该应用程序;它运行良好。这是一个SDK问题。

只是在同一个问题上花了几个小时

导出密钥的哈希值时,请确保指定正确的密钥库和别名。例如:

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore 
| openssl sha1 -binary
| openssl base64
如果未使用调试密钥对APK进行签名,请确保keytool引用了导出密钥库,并且使用了指定的别名。您可以在Eclipse导出Android应用程序向导屏幕的“密钥库选择”和“密钥别名选择”屏幕中看到要使用的密钥库和别名


此外,在应用程序设置的“移动和设备”部分,我将应用程序设置为“本机应用程序”,而不是“HTML 5/移动web”,因为我使用的是Android应用程序(以及iOS应用程序)。

我遇到了类似的问题(无效密钥),对我来说,解决方案是安装Cygwin(我使用的是64位Windows 7)然后从那里重新生成密钥。我得到了一个与PowerShell完全不同的密钥,现在我的应用程序登录正常。

新玩家的另一个陷阱:如果您在

keytool-exportcert-alias androiddebugkey-keystore~/.android/debug.keystore |openssl sha1-二进制 |openssl base64

它会默默地给出错误的结果(我怀疑密码错误消息的摘要)


使用中间文件可以避免这种情况。使用Linux桌面也可以。

更新:我写了一篇关于这个问题的更详细的博文,并解释了SSO是如何导致这个问题的:


这个问题早就在这里(和中)得到了回答,但我将尝试为任何最终在这个问题上遇到障碍的人捕获完整的解决方案

我是使用Facebook Android SDK结合Phonegap和Facebook插件开发的。在我从在模拟器上部署转移到实际设备之前,身份验证步骤一直运行良好。我在运行adb logcat时看到的故障如下

D/Facebook-authorize( 2194): Login failed: invalid_key
W/System.err( 2194): com.facebook.android.FacebookError: invalid_key
我不知道为什么这在模拟器上有效,但在设备上失败了。我怀疑Facebook有一个全面的政策允许未签名的.apk应用程序,因为它们不能被分发

问题是,Facebook需要有关用于签署应用程序的密钥的信息才能允许授权。我不知道的是,当您使用调试密钥库将构建推送到设备时,Eclipse环境会自动对构建进行签名。有关调试密钥库的详细信息,请参阅

为了向Facebook提供有关签名的信息,您需要运行Jay在上面提供的命令(此处重复):

这将生成一个短字符串(可能包括“=”或“/”等字符),用于标识称为证书的签名。一旦你有了这个,你需要把它交给Facebook

在上查找应用程序(如果尚未设置应用程序,请创建一个新应用程序)。进入应用程序摘要页面后,选择编辑设置,然后选择左侧的移动和设备。在Android部分下,您将看到一个键哈希框。将上面命令中的证书字符串粘贴到此框中,然后单击save


给它几分钟的时间来传播,你应该准备好了

我花了大约四个小时解决这样一个问题(Windows7,Eclipse)。keytool实用程序非常狡猾。我已经安装了Eclipse

  • 安装Cygwin
  • 下载适用于Windows的OpenSSL。将其放入任意文件夹,并将路径添加到Windows路径变量中的“lib”和“bin”子文件夹
  • 现在,您应该能够打开Cygwin Bash shell(从开始菜单)并从中成功运行OpenSSL 一些关键工具技巧:

  • 不要使用Windows shell(CMD)-始终使用Cygwin。从CMD运行keytool会产生错误的散列

  • 请记住,您应该使用的正确Unix路径分隔符是“/”,而不是“\”

  • 如果keytool找不到密钥库文件,它只会默默地生成错误的密钥!如果您设置了文件的正确路径,它会询问您的“输入密钥库密码:”。所以,如果不是问你这个问题,请确保你走错了路(另见第2页)
  • 如果键入正确的密钥库密码,则哈希值与根本不传递密钥库密码相同。如果键入错误的密钥库密码,它会自动生成错误的哈希

  • 我可能只是在Windows7中解决了错误的密钥散列问题。请参阅中的我的报告。

    我在Windows和iOS Bash上使用了Cygwin,但两者都给了我错误的密钥!最后,我找到了解决办法

    ProgrammerXR编写了一个非常有用的方法,可以直接从安装在设备上的已签名应用程序中提取密钥哈希-brilliant

    编辑:

    上面的链接不再有效,但你可以在Facebook文档中获得更多详细信息(请参阅“运行示例”部分的“疑难解答”部分)

    您可以使用以下Java Android代码生成密钥:

    try {
       PackageInfo info = getPackageManager().getPackageInfo("**YOURPACKAGENAME**", PackageManager.GET_SIGNATURES);
       for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.i("PXR", Base64.encodeBytes(md.digest()));
       }
    }
    catch (NameNotFoundException e) {}
    catch (NoSuchAlgorithmException e) {}
    

    多亏了Facebook,现在它自己给了一个密钥,同时出现了无效密钥异常。使用该值并在应用程序设置中更新。我使用的是Windows 7 64位计算机,对我来说,密钥最后没有
    =
    (等于),但它工作得很干净。

    这个问题似乎是在安装Facebook应用程序时触发的,因此SDK试图使用该应用程序进行身份验证。而且那个标准杆
    try {
       PackageInfo info = getPackageManager().getPackageInfo("**YOURPACKAGENAME**", PackageManager.GET_SIGNATURES);
       for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.i("PXR", Base64.encodeBytes(md.digest()));
       }
    }
    catch (NameNotFoundException e) {}
    catch (NoSuchAlgorithmException e) {}
    
    mFacebook.authorize(
        MundialRugby2011Activity.this,
        new String[] {"publish_stream", "read_stream", "offline_access"},
        Facebook.FORCE_DIALOG_AUTH,
        new LoginDialogListener()
    );