为啥 Facebook 身份验证 SDK 在不同模式下的表现如此不同?

Posted

技术标签:

【中文标题】为啥 Facebook 身份验证 SDK 在不同模式下的表现如此不同?【英文标题】:Why is the Facebook Authentication SDK behaving so very differently depending on its mode?为什么 Facebook 身份验证 SDK 在不同模式下的表现如此不同? 【发布时间】:2019-11-15 18:51:42 【问题描述】:

我在 App Store 中有一个 android 应用。它在后端使用 Firebase,并通过 Facebook(和 Google)提供社交登录。

最近 Facebook 联系我,警告我通过 Facebook 登录时我的应用程序崩溃/无响应。很困惑,我开始了一些测试。

我发现,如果我在没有安装 Facebook 应用程序的情况下使用 Facebook 登录,一切正常。用户会看到一个浏览器窗口,可以登录,然后他们会被重定向回我的应用程序,我有他们的身份。当然,我在开发过程中发现了这一切,但只是想确认一切仍然有效。

但是当我安装 Facebook 应用程序时(我在开发过程中忽略了这件事),我发现它不再工作了。相反,用户被重定向到这个页面:

对于搜索和可访问性,此图像中的文本为:

登录错误:登录此应用程序时出错。请稍后再试。

我检查了发生这种情况时的日志,发现以下可能是相关的,但我不太确定:

07-05 15:36:28.468   908  5828 I ActivityManager: START u0 act=NATIVE_WITH_FALLBACK cmp=<<redacted>>/com.facebook.FacebookActivity (has extras) from uid 10264
07-05 15:36:28.469   665   665 D QCOM PowerHAL: LAUNCH HINT: ON
07-05 15:36:28.470   665   665 D QCOM PowerHAL: Activity launch hint handled
07-05 15:36:28.495  4837  4837 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@e64bd3e
07-05 15:36:28.689   665   665 D QCOM PowerHAL: LAUNCH HINT: OFF
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue: Exception during service
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue: X.2LH: [code] 404 [message]: Key hash GtvUdcOKFRAE0RY0LIw5veCA+M8= does not match any stored key hashes. (404) [extra]: null
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.1eL.C(:93)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.2sO.C(:26)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.CvC.umA(:38)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.2yi.handleResponse(:224)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.1dO.run(:71)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.0r0.run(:2)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.1qG.run(:2)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.12V.run(:3)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at X.1xB.run(:12)
07-05 15:36:28.946 29406  4941 W fb4a.BlueServiceQueue:         at java.lang.Thread.run(Thread.java:764)
07-05 15:36:28.981   908  8581 I ActivityManager: START u0 cmp=com.facebook.katana/.ProxyAuth (has extras) from uid 10264
07-05 15:36:28.982   665   665 D QCOM PowerHAL: LAUNCH HINT: ON
07-05 15:36:28.983   665   665 D QCOM PowerHAL: Activity launch hint handled
07-05 15:36:29.022 29406 29406 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@4f13a10
07-05 15:36:29.037 29406 29406 E Instrumentation: Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory
07-05 15:36:29.037 29406 29406 E Instrumentation: java.lang.Throwable
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.Instrumentation.getFactory(Instrumentation.java:1224)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at X.05O.newActivity(:3382)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2869)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.os.Handler.dispatchMessage(Handler.java:106)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.os.Looper.loop(Looper.java:193)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at android.app.ActivityThread.main(ActivityThread.java:6718)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at java.lang.reflect.Method.invoke(Native Method)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
07-05 15:36:29.037 29406 29406 E Instrumentation:       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
07-05 15:36:29.045   908  2933 I ActivityManager: START u0 flg=0x2000000 cmp=com.facebook.katana/com.facebook.gdp.ProxyAuth (has extras) from uid 10262
07-05 15:36:29.047   665   665 D QCOM PowerHAL: LAUNCH HINT: ON
07-05 15:36:29.068 29406 29406 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@f095b27
07-05 15:36:29.069 29406 29406 E Instrumentation: Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory
07-05 15:36:29.069 29406 29406 E Instrumentation: java.lang.Throwable
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.Instrumentation.getFactory(Instrumentation.java:1224)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at X.05O.newActivity(:3382)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2869)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.os.Handler.dispatchMessage(Handler.java:106)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.os.Looper.loop(Looper.java:193)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at android.app.ActivityThread.main(ActivityThread.java:6718)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at java.lang.reflect.Method.invoke(Native Method)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
07-05 15:36:29.069 29406 29406 E Instrumentation:       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
07-05 15:36:29.074   908  5828 I ActivityManager: START u0 cmp=com.facebook.katana/com.facebook.gdp.LightWeightProxyAuthActivity (has extras) from uid 10262
07-05 15:36:29.075   665   665 D QCOM PowerHAL: LAUNCH HINT: ON
07-05 15:36:29.121 29406 29406 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@d695c17
07-05 15:36:29.125 29406 29406 E Instrumentation: Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory
07-05 15:36:29.125 29406 29406 E Instrumentation: java.lang.Throwable
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.Instrumentation.getFactory(Instrumentation.java:1224)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at X.05O.newActivity(:3382)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2869)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.os.Handler.dispatchMessage(Handler.java:106)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.os.Looper.loop(Looper.java:193)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at android.app.ActivityThread.main(ActivityThread.java:6718)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at java.lang.reflect.Method.invoke(Native Method)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
07-05 15:36:29.125 29406 29406 E Instrumentation:       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
07-05 15:36:29.166  4837  4846 W System  : A resource failed to call end.
07-05 15:36:29.250   665   665 D QCOM PowerHAL: LAUNCH HINT: OFF
07-05 15:36:29.266   908   952 I ActivityManager: Displayed com.facebook.katana/com.facebook.gdp.LightWeightProxyAuthActivity: +237ms
07-05 15:36:29.266 29463 29463 W BackgroundBroad: type=1400 audit(0.0:9257): avc: denied  read  for name="stats" dev="proc" ino=4026533031 scontext=u:r:untrusted_app:s0:c6,c257,c512,c768 tcontext=u:object_r:proc_qtaguid_stat:s0 tclass=file permissive=0
07-05 15:36:29.447   492  1273 D SurfaceFlinger: duplicate layer name: changing Surface(name=6e58560 com.facebook.katana/com.facebook.gdp.LightWeightProxyAuthActivity)/@0x13e5ed5 - animation-leash to Surface(name=6e58560 com.facebook.katana/com.facebook.gdp.LightWeightProxyAuthActivity)/@0x13e5ed5 - animation-leash#1
07-05 15:36:29.456   492  1273 D SurfaceFlinger: duplicate layer name: changing Surface(name=Dim Layer for - Task=2317)/@0x8471ddb - animation-leash to Surface(name=Dim Layer for - Task=2317)/@0x8471ddb - animation-leash#1
07-05 15:36:29.465   908  2933 I ActivityManager: START u0 cmp=com.facebook.katana/.gdp.WebViewProxyAuth (has extras) from uid 10262
07-05 15:36:29.467   665   665 D QCOM PowerHAL: LAUNCH HINT: ON
07-05 15:36:29.469   665   665 D QCOM PowerHAL: Activity launch hint handled
07-05 15:36:29.507 29406 29406 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@a7d9bb4
07-05 15:36:29.509 29406 29406 E Instrumentation: Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory
07-05 15:36:29.509 29406 29406 E Instrumentation: java.lang.Throwable
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.Instrumentation.getFactory(Instrumentation.java:1224)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at X.05O.newActivity(:3382)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2869)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.os.Handler.dispatchMessage(Handler.java:106)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.os.Looper.loop(Looper.java:193)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at android.app.ActivityThread.main(ActivityThread.java:6718)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at java.lang.reflect.Method.invoke(Native Method)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
07-05 15:36:29.509 29406 29406 E Instrumentation:       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
07-05 15:36:29.517   908  8581 I ActivityManager: START u0 cmp=com.facebook.katana/.gdp.ProxyAuthDialog (has extras) from uid 10262
07-05 15:36:29.519   665   665 D QCOM PowerHAL: LAUNCH HINT: ON
07-05 15:36:29.567 29406 29406 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@19959e4
07-05 15:36:29.569 29406 29406 E Instrumentation: Uninitialized ActivityThread, likely app-created Instrumentation, disabling AppComponentFactory
07-05 15:36:29.569 29406 29406 E Instrumentation: java.lang.Throwable
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.Instrumentation.getFactory(Instrumentation.java:1224)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.Instrumentation.newActivity(Instrumentation.java:1215)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at X.05O.newActivity(:3382)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2869)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3086)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1816)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.os.Handler.dispatchMessage(Handler.java:106)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.os.Looper.loop(Looper.java:193)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at android.app.ActivityThread.main(ActivityThread.java:6718)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at java.lang.reflect.Method.invoke(Native Method)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
07-05 15:36:29.569 29406 29406 E Instrumentation:       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
07-05 15:36:29.651   492   540 D SurfaceFlinger: duplicate layer name: changing com.facebook.katana/com.facebook.katana.gdp.ProxyAuthDialog to com.facebook.katana/com.facebook.katana.gdp.ProxyAuthDialog#1
07-05 15:36:29.697   492  1763 D SurfaceFlinger: duplicate layer name: changing Dim Layer for - Task=2317 to Dim Layer for - Task=2317#1
07-05 15:36:29.720   665   665 D QCOM PowerHAL: LAUNCH HINT: OFF
07-05 15:36:29.731   492   540 W SurfaceFlinger: Attempting to set client state on removed layer: Dim Layer for - Task=2317#0
07-05 15:36:29.731   492   540 W SurfaceFlinger: Attempting to destroy on removed layer: Dim Layer for - Task=2317#0

注意到NATIVE_WITH_FALLBACK模式的使用,改成WEB_ONLY进行测试。虽然这让我克服了上图所示的原始问题,但它创造了另一个问题。它没有询问我登录详细信息,而是显示以下内容:

同样,文本是:

您之前使用 Facebook 登录 $MY_APP。要继续吗?

如果我选择继续(除了取消别无选择),它会返回到我的应用程序,但 Firebase 给了我ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL 错误,表明该帐户已与另一个提供商相关联。当我签入 Firebase 控制台时,该帐户显示为 Facebook 帐户。所以这就像安装 Facebook 应用让 Firebase 认为它是一个独立的社交提供者之类的。

最后,有点绝望,我尝试将身份验证模式切换为WEB_VIEW_ONLY。果然,这向我展示了与在未安装 Facebook 的情况下登录时完全相同的体验。此外,一切都按预期进行。

我的问题是我不完全确定这一切的含义是什么(注意:请参阅下面的更新)。我记得在某处读到过关于原生 Facebook 登录不再是一回事(或者可能正好相反,应该使用它)。基本上,我很困惑,非常感谢以下问题的任何答案:

使用WEB_VIEW_ONLY 是否可以接受? 为什么使用NATIVE_WITH_FALLBACK 会在我的帖子开头显示错误? 为什么WEB_ONLY 似乎将同一个帐户视为不同的提供商? 为什么 Facebook 登录 SDK 在这些模式下的行为如此不同?我认为它们是一种无害的偏好,对身份验证本身没有任何影响,但天哪,我错了。

请注意,在所有情况下,我都在关注 the official docs,包括使用最新的 SDK 版本:

implementation 'com.facebook.android:facebook-login:[5,6)'

感谢您的帮助。

更新:我将我的应用更新为WEB_VIEW_ONLY 并重新提交。 Facebook 现在告诉我:

您的应用现在违反了平台政策 8.2:实现 Facebook 登录的原生 ios 和 Android 应用必须使用我们的官方 SDK 进行登录。 请确保您的应用使用最新版本的登录 SDK。

所以我现在陷入了困境。

【问题讨论】:

【参考方案1】:

为了解决您的问题, 登录开发者帐户 > Facebook 应用 > 设置 现在,将应用程序hash 粘贴到key hashes 字段中,然后保存配置。 运行你的应用程序,你会发现错误消失了。

您可能会发现屏幕截图对应用程序设置很有帮助。

【讨论】:

【参考方案2】:

这里的许多答案都提供了部分解决方案,但我相信这是完整的解决方案和解释。

您面临的问题与 HashKey 值与您构建 apk 的设备不匹配有关。您使用的运行构建 apk 的计算机、mac、pc 等具有不同的哈希键,并且该哈希键被融合到最终的 apk 构建中,因此如果构建是从不同的计算机完成的,则 Facebook 登录将无法工作。

解决方案是做两件事。

首先,每当您在新计算机上创建 apk 构建时,您都需要生成 HashKey 字符串并获取它。执行此操作的代码在这里:

public static String getMyHashKey(Context context, String packageName)
    try 
        PackageInfo info = context.getPackageManager().getPackageInfo(
                packageName, PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) 
            MessageDigest md = MessageDigest.getInstance(SHA);
            md.update(signature.toByteArray());
            return Base64.encodeToString(md.digest(), Base64.DEFAULT);
        
     catch (PackageManager.NameNotFoundException e) 
        e.printStackTrace();
     catch (NoSuchAlgorithmException e) 
        e.printStackTrace();
    
    return null;

其次,您需要在设置中将该字符串添加到您的 Facebook 应用程序。这可以通过以下两个步骤来完成:

1) 转到developers.facebook.com 并转到相关应用。然后单击设置-> 基本。

2) 之后,向下滚动到 Android 区域并填写字段。请注意,您可以有多个 HashKey!

3) 保存更新,等待几分钟以进行更新,然后重试。那应该可以解决您面临的问题。

【讨论】:

【参考方案3】:

您的日志显示密钥哈希不匹配,因此您需要在 facebook 开发人员帐户中添加密钥哈希fb 开发者帐号..

public void generatekeyhash() 
    try 
        PackageInfo info = getPackageManager().getPackageInfo(
                getPackageName(),
                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) 

    

【讨论】:

【参考方案4】:

关于这个问题的解释如下:

07-05 15:36:28.946 29406 4941 W fb4a.BlueServiceQueue: 异常 服务期间 07-05 15:36:28.946 29406 4941 W fb4a.BlueServiceQueue: X.2LH:[代码] 404 [消息]:密钥哈希 GtvUdcOKFRAE0RY0LIw5veCA+M8= 不匹配任何存储的密钥哈希。 (404)[额外]:空

请记住,您在 facebook 应用程序中配置的密钥哈希与您的应用程序所使用的密钥库(证书)相关。

您必须使用您签署应用程序的密钥哈希,如果您不知道,我建议您从您的密钥库中重新获取它:

https://developers.facebook.com/docs/android/getting-started/

为什么 Facebook 登录 SDK 的行为如此不同 这些模式?我认为它们是一种无害的偏好, 对身份验证本身没有任何影响,但天哪,我错了。

在 web 中你没有问题,但如果你在应用程序中,你需要授权使用应用程序,并且非常重要 对于 android 应用程序中的此实现,你需要使用 Facebook SDK,在这种情况下,您需要获取用于签署您的应用程序的密钥哈希证书。

【讨论】:

【参考方案5】:

在您的日志顶部,它显示Key hash GtvUdcOKFRAE0RY0LIw5veCA+M8= does not match any stored key hashes.

您在构建发布时可能使用了错误的 keyhash。显然,当您使用 this link 中讨论的错误 keyhash 时会发生此问题。

至于为什么它在WEB模式下工作,这是因为SDK检查了keyhash,并且由于您转到网页,所以您没有收到错误。您正在调试模式下运行,并且调试模式密钥哈希可能是正确的,这可能是它在您的设备上工作的原因。

【讨论】:

以上是关于为啥 Facebook 身份验证 SDK 在不同模式下的表现如此不同?的主要内容,如果未能解决你的问题,请参考以下文章

为 iOS SDK 迁移 Facebook 身份验证凭据

Facebook 身份验证使用 php sdk 和 Yii 框架

无法使用 iOS SDK 和本机 Facebook 应用程序对 Facebook 进行身份验证

使用 Facebook 令牌的 Firebase Unity SDK 身份验证

iOS facebook SDK:登录已通过身份验证

是否可以使用 facebook 服务器端身份验证和 facebook ios sdk