使用多个域登录 Facebook

Posted

技术标签:

【中文标题】使用多个域登录 Facebook【英文标题】:Facebook login with multiple domains 【发布时间】:2012-09-06 08:41:20 【问题描述】:

我知道 facebook 允许我为我的应用程序指定多个域。

但在“使用 Facebook 登录的网站”中,我只能指定一个网址。

我是否可以使用同一个 App 对 domain.se、domain.dk 和 domain.net 上的用户进行身份验证?还是应该为每个域创建一个应用程序?

【问题讨论】:

【参考方案1】:

技术上可以在多个域上使用 Facebook Connect,但有一些限制(最多 5 个域)。

因此,执行此操作的关键是在您的应用设置下的 App Domain 字段中添加所有域

问题,然而,Facebook 只允许您添加从您的画布 URL 或站点或页面标签 URL 派生的域,因此如果您尝试输入其他任何内容,您会收到一个错误看起来像这样:

解决方案是使用在Facebook上创建应用程序网站Facebook标签添加平台 按钮,然后输入指向您其他域的 URL。这是我的意思的一个例子:

如果您为每个字段使用唯一域,您最多可以使用 5 个不同的域。我已经用最多 3 个域测试了这种技术,但我认为它应该适用于所有 5 个域。

注意:Facebook 管理功能会不时更改,因此所有这些都可能会发生变化

【讨论】:

Mobile Site URL 添加另一个网址对我有用。在我的情况下,这是为了测试,http://localhost 我想这是我们现在能做的最好的事情了。我有多个登台应用程序,并希望只允许 some-pattern-*.herokuapp.com 用于我的 facebook 登台应用程序,但我不能。 一切都变了 Facebook API 不断变化! 将不胜感激更新更改...我已经让它与修补一起使用,但我不认为 Canvas 在 2017 年是可用的选项。【参考方案2】:

只要您在应用程序设置中列出所有所需的App Domains,您就应该能够在其中任何一个上对用户进行身份验证。

“使用 Facebook 登录的网站”实际上仅用作指向您的网站/应用程序的链接。

更新 2(2016 年 7 月):

应用程序域必须与 Secure Canvas URL、Mobile Site URL、Unity Binary URL、Site URL 或 Secure Page Tab URL 的域匹配。

更新(2013 年 12 月): 在编写原始答案时,可以在应用程序设置中列出任何域,但从那时起,应用程序设置的 UI(以及处理应用程序域的方式)至少更改了几次,在某些时候你只能列出派生自应用程序画布页面之一的域

2013 年 12 月开始,可以(再次)列出不是从应用程序画布 URL 派生的域。

【讨论】:

我收到此错误:错误 [mydomain].com 必须源自以下之一:站点 URL、移动站点 URL、画布 URL、安全画布 URL、页面选项卡 URL 或安全页面选项卡 URL。 仅仅因为它不能按照您想要的方式工作,它不会出错...如果列出的不同域为 Canvas/Mobile-Canvas/Tab URL,那么所有这些域都可以用于授权用户(即使是域限制,目前还不是这样) 您能否确认一下,我无法添加多个域(2/2014),我找到了解决方法,但并不理想。 @MetablocksCorp,哇,这看起来像一个错误,我可以为我的许多应用程序列出多个域(即使是那些不是从列出的 URL 派生的域),但这不适用于新创建的。 错了!仅派生自网站 URL 的域【参考方案3】:

假设您的域由同一个 Web 服务器提供服务并且您可以访问该 Web 服务器,您可以使用手动登录过程:https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow 从任意多个域登录。

假设您的域是 site1.com,site2.com.... 而不是使用 Facebook javascript API,您只需在每个站点上放置一个普通的使用 Facebook 登录按钮,该按钮会将浏览器重定向到 facebook 登录上面文章中描述的页面。在状态变量中,您可以指定一个代码,该代码指示您的哪些站点正在请求登录。在重定向中,您将使用您分配给您的 Web 服务器的单个服务域(例如 fb.mywebserver.com),并且您在 facebook 登录设置页面中将其指定为经过验证的重定向 url。所有站点都会重定向到同一个 url,避免了支持多个域的问题。

一旦用户登录,浏览器将重定向到 fb.mywebserver.com 并将状态传递给它,它会告诉您哪个站点正在请求登录以及您可以在后端使用该代码来检索用户信息的代码使用 Facebook 图形 API。您将此信息与 uid 一起存储在数据存储中,然后使用状态中的信息,您重定向到适当的站点,包括指示 Facebook 登录的参数(例如 site1.com?fbc=some uid)。浏览器会乖乖地调用 site1.com?fbc... 您的 Web 服务器将收到此请求并检测 fbc 参数,该参数告诉它将相应的 Facebook 登录用户与该站点相关联。然后,它可以使用 uid 检索登录的用户信息,例如,返回该用户的会话 cookie 以及页面。如果您在服务器上生成页面,您当然也可以包含一个欢迎“用户”,或者您的客户端代码可以执行 ajax 调用来检索该信息。

从用户的角度来看,他们按下“使用 Facebook 登录”按钮,被重定向到他们登录的 Facebook 登录页面,然后在登录状态下被重定向回您的站点。没有登录弹出窗口那么好,但可能可以接受。

类似的过程也可以用于谷歌登录

【讨论】:

【参考方案4】:

我发现在开发/生产场景中做的最好的事情是添加一个“测试应用程序”,然后为您的开发网站添加一个平台 - 如果您必须提供“页面标签网址”所在的位置将其用作平台。

如果您需要申请状态或权限审查,Facebook 要求您的“页面 url”是实时/可访问的。

这让我了解了“登录开发”/“登录生产”场景。

【讨论】:

以上是关于使用多个域登录 Facebook的主要内容,如果未能解决你的问题,请参考以下文章

防止多个用户使用同一个浏览器登录同一个域

尝试在多个域上使用 Azure AFDS 登录

怎样设置域用户只能登录指定主机

Kotlin Facebook 登录、登录并跳过弹出窗口

Cookie同域,跨域单点登录(转)

基于 SAML 2.0 的跨域单点登录 - 概念