我已经跟踪了Railscast #235次,试图建立一个最小的Facebook身份验证.

我首先设置了一个Twitter身份验证,就像瑞安自己做的那样.这是完美的.

然后我开始添加Facebook登录.然而,在授权应用程序后,重定向到/auth/facebook/callback失败,原因是:

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed

我正在本地主机上工作.我没有在应用程序中设置任何SSL.我做错了什么?

推荐答案

真正的问题是Faraday(Omniauth/Oauth用于HTTP调用)没有没有为OpenSSL设置ca_路径变量.至少在Ubuntu上,大多数根证书存储在"/etc/ssl/certs"中.由于Faraday不是没有设置这个变量(目前还没有这样做的方法),OpenSSL不是没有找到Facebook SSL证书的根证书.

我有submitted a pull request to Faraday个,这将增加对这个变量的支持,希望他们很快就会引入这个变化.或者你可以用Patch或者Faradamonthis.之后,您应该在Gemspec中指定OAuth2 gem的0.3.0版本,该版本支持将SSL选项传递给Faraday现在只需升级到Faraday 0.6.1,它支持传递ca_path变量,并升级到OmniAuth 0.2.2,它对OAuth2具有适当的依赖关系.然后,只需在Omniauth初始值设定项中添加以下内容,即可正确解决此问题:

Rails.application.config.middleware.use OmniAuth::Builder do
    provider :facebook, FACEBOOK_KEY, FACEBOOK_SECRET, {:client_options => {:ssl => {:ca_path => "/etc/ssl/certs"}}}
end

所以,概括一下:

  1. 需要更新法拉第以支持SSL ca_路径安装Faraday 0.6.1
  2. 你的应用程序需要使用OAuth2版本0.3.0.您可能需要fork omniauth,因为它目前在0.2版本中有一个较小的版本依赖关系.x树升级到OmniAuth 0.2.2
  3. 修改提供者初始值设定项以指向系统的证书路径(Ubuntu等上的"/etc/ssl/certs")

希望法拉第和Omniauth的下一个版本都能包含这个解决方案

感谢上面的KirylP让我走上了正确的道路.

Ruby-on-rails相关问答推荐

在控制器操作中适当使用ActiveModel Dirty

Rails6.1|有没有一种方法可以判断哪些关联已经加入到一个范围中?

如何从 gem 覆盖 JSONAPI.configure

无法在 Rails 中使用 wkhtmltopdf 写入临时文件

如何使用 Rails 语义记录器记录整个请求(标头、正文等)

插件和 Ruby gem 之间的区别?

Rails 3 应用程序的 MySQL 集群 (NDB) 与 MySQL 复制 (InnoDB):优点/缺点?

如何在 IRB/Rails 控制台中 suppress 返回值的输出?

Rails 是否带有未授权异常?

添加自定义字段/列以使用 Rails 4 进行设计

URL中的Rails点而不是斜杠

如何在特定时区(最好是我的应用程序的默认时区,而不是 UTC)中创建新的 DateTime 对象?

警告:引用了顶级常量

Rails Activeadmin - 自定义关联 Select 框

如何在 Rails ActiveRecord 中指定日期小于今天的条件

默认呈现 JSON 而不是 HTML?

错误:无法构建 gem 原生扩展 - 安装 mysql2 时出错

rails respond_to format.js API

redirect_to 和 render 是可交换的吗?

Ruby 1.87 与 1.92 Date.parse