在本地主机上运行Facebook应用程序

92

我计划从本地主机连接到Facebook聊天。我需要从Facebook获取会话密钥。当我将网站URL设置为localhost:8080ip-address:8080时,它无法工作。

我了解到可以设置两个具有不同API密钥的应用程序,一个在开发机器上运行,另一个在本地主机上运行,但我并没有完全明白。

请问有人能够解释如何在本地主机上运行Facebook应用程序吗?


是的...我想从我的电脑攻击Facebook服务器...在这里看到了一个相关的帖子https://dev59.com/MnI-5IYBdhLWcg3wZ3YR....但我没看懂... - enthusiastic
@Kavya 如果你想要创建一个,你还没有提到你将要使用的编程语言是什么? - Searock
我会给你使用案例...我需要使用 jQuery 和 JavaScript 将 Facebook 聊天集成到我的应用程序中...这只涉及客户端编程... - enthusiastic
2
我写了一篇关于此的教程 - ifaour
5
@xoxoxo,请在你的沟通中使用适当的标点和拼写。 - bart
显示剩余3条评论
13个回答

77

我之前写过一篇教程

最重要的点是 "网站 URL":

网站 URL:http://localhost/app_name/

其中的文件夹结构大概是这样的:

app_name
¦   index.php
¦
+---canvas
¦   ¦   index.php
¦   ¦
¦   +---css
¦           main.css
¦           reset.css
¦
+---src
        facebook.php
        fb_ca_chain_bundle.crt

编辑:
Kavya: 在没有IP或端口的情况下,FB服务器如何识别我的本地主机?

我不认为这与Facebook有任何关系。我猜想,由于iframe的src参数是从客户端加载的,因此它会将您的本地URL视为直接放在浏览器中的内容。

例如,在您的在线服务器上有一个文件(例如:online.php):

<iframe src="http://localhost/test.php" width="100%" height="100%">
    <p>Not supported!</p>
</iframe>

在本地主目录下,有一个名为test.php的文件:

<?php echo "Hello from Localhost!"; ?>

现在访问 http://your_domain.com/online.php ,您将看到本地主机文件的内容!

这就是实时订阅和取消授权回调(只是举个例子)无法使用localhost URL的原因!因为Facebook会向这些URL发送HTTP请求,但明显Facebook服务器不会将这些URL转换为您的URL!


我似乎找不到“站点网址”,你知道它在哪个选项卡中或者在哪里吗? - user962206
这个能用在8080端口吗?我仍然在使用网站URL时遇到错误:http://localhost:8080/auth/index.html,并且出错的网页是http://localhost:8080/auth/index.html,而channelurl行是:channelUrl : '//localhost:8080/auth/channel.html', - necromancer
我不理解“文件夹结构”部分。如果您只是使用Facebook登录到您的网站,以便在页面上加载Facebook评论,那么您是否仍然需要那个画布结构? - AlxVallejo
有一些隧道工具可以让你给本地主机分配一个公共名称并使其可见,这样Facebook就可以进行回传。我创建了一个名为PageKite的工具,还有其他类似的工具。 - Bjarni Rúnar

29

如果你使用本地主机:

在Facebook-->设置-->基本信息页面, 在"应用域名"字段中写入"localhost", 然后点击"+添加平台"选择"网站",

它将创建两个字段 "移动站点URL" 和 "站点URL", 在"站点URL"中再次输入 "localhost"。

对我来说这样可以正常使用。


谢谢,我尝试了其他的解决方案,但最终这个是有效的。 - rahulmishra
在“网站 URL”字段中,我输入了:http://localhost/,但是没有起作用。我还按照您的建议将 localhost 添加到“应用程序域”字段中,这很好地解决了问题。谢谢。 - RegarBoy

23
你也可以编辑“hosts”文件并创建您的域名的本地变体。 示例 如果您的实际Facebook应用程序地址为“example.com”,则可以在“hosts”文件中创建指向“localhost”的“localhost.example.com”(仅从电脑访问),并在此域下运行您的本地网站。 您可以以这种方式欺骗Facebook。

1
非常好用,谢谢!顺便提一下,hosts文件在Windows 7上的路径是 C:/Windows/System32/drivers/etc/hosts,在Ubuntu上则是 /etc/hosts - pztrick
优秀的方法论。谢谢。 - Jerad
我应该将应用程序域和画布网址设置为什么? - Craig
这种方法无法指定端口,因此您需要使用反向代理来允许在同一域上进行开发。请参见https://dev59.com/Ymgv5IYBdhLWcg3wQ-qd - MagicLAMP

7
在您的应用程序的基本设置(https://developers.facebook.com/apps)下,选择“设置->基本->选择您的应用程序如何与Facebook集成...”
使用“站点URL:”和“移动站点URL:”来保存您的生产和开发URL。两个站点都将被允许进行身份验证。我只是使用Facebook进行身份验证,因此不需要任何移动站点重定向功能。在测试身份验证时,我通常会将“移动站点URL:”更改为我的“localhost:12345”站点,然后在完成后将其设置回正常状态。

6

2013 年 8 月,Facebook 不允许为应用设置带有端口的域名,例如 "localhost:3000"。

因此,您可以使用 https://pagekite.net 将您的 localhost:port 隧道传输到正确的域名上。

Rails 开发人员可以免费使用 http://progrium.com/localtunnel/

  • Facebook 同一时间只允许一个应用程序域名。如果您正在尝试添加另一个域名,例如 localhost,则会显示有关域名的不同错误。请确保同时只使用一个回调和应用程序域名设置的域名。

4
今天我成功了。我的URL是http://localhost:8888。我给Facebook的域名是localhost。我以为它不起作用是因为我试图使用FB.api方法来提取数据。我一直得到一个"undefined"名称和没有源的图片,所以肯定无法访问Graph。
后来我意识到我的问题实际上是我只传递了/me的第一个参数给FB.api,而且我没有令牌。所以你需要使用FB.getLoginStatus函数获取一个令牌,这应该添加到/me参数中。

2

好的,我不确定这些答案是怎么回事,但我会告诉你在我的工作中,一位高级开发人员建议我采用的方法。我正在使用Ruby on Rails并使用Facebook的JavaScript代码来获取访问令牌。

问题:为了进行身份验证,Facebook将从您的地址栏中获取URL,并将其与其文件中的内容进行比较。出于某种原因,他们不允许您使用localhost:3000。但是,您可以使用完全虚构的域名,例如yoursite.dev,通过运行本地服务器并将yoursite.dev指向127.0.0.1:3000或您的本地主机指向的任何位置。

步骤1:安装或更新Nginx

$ brew install nginx(安装)或$ brew upgrade nginx(更新)

步骤2:打开nginx配置文件

/usr/local/etc/nginx/nginx.conf(通常在此处)

/opt/boxen/config/nginx/nginx.conf(如果您使用Boxen)

步骤3:将此代码添加到您的http {}块中

proxy_pass替换为您想要将yoursite.dev指向的位置。在我的情况下,它替换了localhost:3000或等效的127.0.0.1:3000

server {
  listen       yoursite.dev:80;
  server_name  yoursite.dev;
  location / {
    proxy_pass http://127.0.0.1:3000;
  }
}

步骤 4:编辑您的主机文件,在 Mac 上为 /etc/hosts,包括以下内容:

127.0.0.1   yoursite.dev

这个文件将域名指向本地主机。当Nginx监听到本地主机并匹配规则时,它将进行重定向。
步骤5:以后每次使用开发环境时,在地址栏中使用yoursite.dev而不是localhost:3000,这样Facebook就可以正确登录。

2

@ifaour 我按照您的教程操作,但出现了错误。API错误代码:191 API错误描述:指定的URL不属于该应用程序 错误消息:redirect_uri不属于该应用程序。我不需要它在Facebook内运行... - enthusiastic
@Kavya,只需将画布URL添加为http://localhost/app_path并打开fb应用程序,这样它就会从本地主机运行您的应用程序。非常抱歉晚了,因为非常忙。 - JustCoding
另一种方法是将您的站点/画布URL映射到本地,而不是指定localhost。然后,您可以使用目标域。我不确定您正在开发哪种架构,但在Windows下,您可以通过在本地设置正确的绑定并在C:\ Windows \ System32 \ drivers \ etc中添加主机文件别名来实现此目的,例如添加行127.0.0.1 yourproject.yourdomain.net。 - dumbledad

1

Forward 是一个非常好的工具,可以帮助在本地开发 Facebook 应用程序,它支持 SSL,因此证书不是问题。

https://forwardhq.com/in-use/facebook

免责声明:我是开发人员之一。

1
PageKite是Forward的竞争对手之一(我就是它的创造者!;-))。 - Bjarni Rúnar
在尝试了太阳底下的所有方法之后,这个方法对我起作用了。唯一的问题是所有的转发都非常缓慢。虽然比不上得到FB回调要好!谢谢。 - Craig

0

你需要设置你的应用程序在本地运行时使用https

你可以按照这个步骤在Ubuntu上设置HTTPS

https://www.digitalocean.com/community/articles/how-to-create-a-ssl-certificate-on-apache-for-ubuntu-12-04

你需要执行以下步骤:
安装 Apache(如果你没有安装)
sudo apt-get install apache2

第一步——激活SSL模块

sudo a2enmod ssl
sudo service apache2 restart

第二步——创建新目录

sudo mkdir /etc/apache2/ssl

第三步——创建自签名 SSL 证书

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache/ssl/apache.key -out /etc/apache2/ssl/apache.crt

通过此命令,我们将创建自签名的 SSL 证书和保护它的服务器密钥,并将它们放置在新目录中。 最重要的一行是“通用名称”。在此处输入您的官方域名,或者如果您还没有,则输入站点的 IP 地址。

通用名称(例如服务器 FQDN 或 YOUR 名称)[]:example.com 或 localhost

第四步 - 设置证书

sudo vim /etc/apache2/sites-available/default-ssl

查找以下行并使用您的设置进行编辑

ServerName localhost或example.com

SSLEngine打开SSLCertificateFile /etc/apache2/ssl/apache.crt

SSLCertificateKeyFile /etc/apache2/ssl/apache.key

第五步-激活新虚拟主机

sudo a2ensite default-ssl
sudo service apache2 reload

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接