ruby-on-rails 已升级到Rails 6 -开发OmniAuth Twitter无方法错误

tmb3ates  于 2022-11-19  发布在  Ruby
关注(0)|答案(2)|浏览(132)

将Rails与devices沿着升级到6。
针对此CSRF错误进行更新后,https://github.com/heartcombo/devise/issues/5236到达:

Started POST "/users/auth/twitter" for ::1 at 2022-09-22 21:24:44 -0400
(twitter) Request phase initiated.
(twitter) Authentication failure! undefined method `downcase' for nil:NilClass

        "#{u.scheme.downcase}://#{u.host.downcase}#{(u.scheme.casecmp("http").zero? && u.port != 80) || (u.scheme.casecmp("https").zero? && u.port != 443) ? ":#{u.port}" : ""}#{u.path && u.path != "" ? u.path : "/"}"
                                        ^^^^^^^^^: NoMethodError, undefined method `downcase' for nil:NilClass

Processing by Users::OmniauthCallbacksController#failure as HTML

宝石文件:

ruby "3.1.0"
gem 'rails', '6.0.3.1'

gem 'devise'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem "omniauth-rails_csrf_protection", "~> 1.0"

link_to用于带POST的CSRF,以前为GET

<%= link_to "Log In" user_twitter_omniauth_authorize_path  method: :post, "data-turbo": false %>

在全授权rb中
第一个
routes.rb

devise_for :users, defaults: { format: :html }, controllers: { omniauth_callbacks: 'users/omniauth_callbacks', passwords: 'users/passwords' }

导致我们的错误的代码行似乎在此处定义https://rubydoc.info/gems/oauth/0.5.5/OAuth%2FRequestProxy%2FBase:normalized_uri

xqnpmsa8

xqnpmsa81#

顶级域名;

要解决此问题,只需将oauth gem升级到最新版本。

bundle update oauth

长版本XD

在最近的一次升级后,我也遇到了同样的问题,但在我的情况下,我的模型不是用device管理的,所以我决定进一步研究;在回溯之后,经过与相关gem的长时间调试会话,我在oauth-1.0.0/lib/oauth/consumer.rb中的OAuth模块上的Consumer类的initialize方法中发现了一个bug

# ensure that keys are symbols

@options = @@default_options.merge(options.transform_keys(&:to_sym))

问题是在merge之后,@@default_options的键siteauthorize_path仍然被定义为字符串

{"authorize_path"=>"/oauth/authenticate", "site"=>"https://api.twitter.com", "proxy"=>nil}

因此,接收这些选项参数的其余代码和库无法正确找到用于获取端点的选项[:site],因此返回类似于以下内容的内容:

http://:80/request_token

和预期一样,使用URI.parse解析该字符串,就像在oauth-1.0.0/lib/oauth/client/net_http.rb中的oauth_full_request_uri方法中所做的那样,根本不会返回任何主机,并引发问题中提到的错误。
所以我决定做这个小改动,一切又正常了。

@options = @@default_options.merge(options).transform_keys(&:to_sym)

我正准备提出一个拉取请求来帮助解决这个问题,我发现lib的作者把repo移到了GitLab,还发现他已经在最新版本中使用snaky_hash lib解决了这个问题XD,看这里:
https://gitlab.com/oauth-xx/oauth/-/commit/7110a74690729b9abf8005cf0f58eedfc64f6ca3
所以只要更新宝石就足够了。我希望这对你们有帮助!

htzpubme

htzpubme2#

此错误可能是由于Twitter API返回用户配置文件图像的nil值。这会导致错误,因为代码试图调用nil值的downcase方法。解决方法是在omniauth.rb文件中的Twitter提供程序中添加secure_image_url和image_size选项。secure_image_url选项将确保图像URL始终以HTTPS URL的形式返回。image_size选项将确保图像URL始终以原始大小返回。
将以下内容添加到omniauth.rb文件中:

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :twitter, ENV['TWITTER_API_KEY'], ENV['TWITTER_API_SECRET'], {
    secure_image_url: true,
    image_size: 'original'
  }
end

相关问题