我一直在遵循 facebook 机器人设置指南,并设置了一个在 EC2 实例上运行的回调 URL。
我在尝试验证回调 url 并验证令牌时收到错误(请参阅本文标题)。
https://360.finance:1337/webhook是我的webhook,验证令牌在我的环境变量和我的facebook设置中是相同的。
我使用 LetsEncrypt 设置了 SSL,据我所知,SSL 并未显示为自签名,因此它看起来工作正常(请注意,我对这一切都是新手)
在 https://www.ssllabs.com/ssltest/analyze.html?d=360.finance&hideResults=on 检查,一切看起来都正确。
我还将 facebook 页面令牌作为环境变量包含在我的 index.js 文件中
我已经测试了 netcat / telnet 到我的 ec2 IP 上的该端口,并且成功了
您必须以纯文本形式返回 hub.challenge 令牌的 http 响应。
在添加回调 URL 或验证令牌之前,我们需要在 Facebook 应用程序设置页面上更新以下内容。
Facebook 没有指出我们的确切错误,这很奇怪。
请勿使用
ngrok
或 localtunnel
。
我都尝试过,但没有运气。
如果您确实希望本地开发服务器进行身份验证 - 您可以通过 ssh 端口转发到面向公众的服务器。
ssh -R 4000:localhost:4000 root@your-server-ip
这样你就可以将 nginx 设置为反向代理 443 到 4000 并使用
certbot
处理 ssl
nginx 反向代理的示例配置(运行之前
certbot
)
server {
server_name my-own-domain;
root /usr/share/nginx/html;
index index.html index.htm;
listen 80;
location / {
proxy_pass http://localhost:4000/;
}
}
所以你“只”需要:
现在您有了自己的私人
ngrok
替代品
检查回调服务器是否正在运行?
回调和令牌来自您的服务器。
对于 python 用户,您需要使用点而不是下划线。当我使用下划线版本 Facebook API 无法访问
challenge
时,我没有得到它,但是当我使用邮递员复制相同的 GET 请求时,我可以访问 challenge
。
# Wrong way
challenge = request.GET['hub_challenge']
# Right way
challenge = request.GET['hub.challenge']
return HttpResponse(challenge)
经过 2-3 小时的调试,我的案例返回“\”1412656657\“”而不是“1412656657”。
修复了返回 Content() 内的值的问题
public ContentResult Get()
{
// validate token
// get hub.challenge from query string
var hubChallenge = Request.Query["hub.challenge"];
return Content(hubChallenge, "text/plain");
}