Passport-Facebook 认证不能为所有 Facebook 帐户提供电子邮件

在使用 Passport-Facebook 进行身份验证时,您可能会发现对于某些 Facebook 帐户,无法获取其电子邮件地址。这通常是因为 Facebook 用户没有授权将其电子邮件地址公开给第三方应用程序。本文介绍了此问题的原因以及如何解决它。

问题分析

当用户使用 Facebook 登录应用程序时,Passport-Facebook 策略会向 Facebook 发送一个请求来获取用户的公开资料,包括姓名、电子邮件地址和其他详细信息。然而,并非所有 Facebook 用户都愿意授权让第三方应用程序访问他们的电子邮件地址。因此,如果用户在 Facebook 上未公开其电子邮件地址,则 Passport-Facebook 将无法为该用户提供电子邮件地址。

解决方案

要解决此问题,可以更改 Passport-Facebook 的配置,以便在未获得用户电子邮件地址时不导致身份验证失败。这可以通过添加 profileFields 选项来完成,如下所示:

---------------- ------------------
    --------- ----------------
    ------------- --------------------
    ------------ -----------------------------------------------
    -------------- ------ -------------- --------- --------
  --
  --------------------- ------------- -------- ----- -
    -- ---
  -
---

如上所示,将 profileFields 选项设置为一个包含 'email' 的数组,即使用户未公开其电子邮件地址,Passport-Facebook 也不会因为缺少电子邮件地址而失败。在这种情况下,Passport-Facebook 将返回一个带有用户 ID、姓名和照片的简化版本的用户资料。

如果您需要获取用户电子邮件地址,则可以通过请求 Facebook 用户的电子邮件权限来获得。方法是在调用 passport.authenticate() 时添加 scope 选项,如下所示:

-------------------------
  --------------------------------- - ------ --------- ----

添加 scope 选项后,当用户进行身份验证并授权第三方应用程序访问其电子邮件地址时,Passport-Facebook 将能够获取用户的电子邮件地址。

总结

在 Passport-Facebook 身份验证中,某些 Facebook 帐户可能无法提供电子邮件地址。这通常是因为用户没有授权让第三方应用程序访问其电子邮件地址。要解决此问题,可以更改 Passport-Facebook 的配置,以便在未获得用户电子邮件地址时不导致身份验证失败。如果需要获取用户的电子邮件地址,则应请求 Facebook 用户的电子邮件权限。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/27552