升级Rails到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 HTMLGemfile:
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"用于CSRF的link_to和POST,以前
<%= link_to "Log In" user_twitter_omniauth_authorize_path method: :post, "data-turbo": false %>在omniauth.rb中
include Devise::OmniAuth::UrlHelpers
OmniAuth.config.allowed_request_methods = [:post]
OmniAuth.config.logger = Rails.logger if Rails.env.development?
OmniAuth.config.full_host = Rails.env.production? ? 'https://www.website.com' : 'http://localhost:3000'
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, ENV["FACEBOOK_KEY"], ENV["FACEBOOK_SECRET"], callback_url: ENV["FACEBOOK_CALLBACK"]
provider :twitter, ENV['TWITTER_API_KEY'], ENV['TWITTER_API_SECRET'], {
secure_image_url: true,
image_size: 'original'
}
provider :apple, ENV['APPLE_CLIENT_ID'], '', {
scope: 'email name',
team_id: ENV['APPLE_TEAM_ID'],
key_id: ENV['APPLE_KEY_ID'],
pem: Base64.strict_decode64(ENV['APPLE_P8_BASE64'])
}
endclass Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def self.provides_callback_for(provider)
class_eval %Q{
def #{provider}
@user = User.find_for_oauth(request.env["omniauth.auth"], current_user)
skip_authorization
authorize @user, policy_class: OmniauthCallbackPolicy
if @user.persisted?
@user.remember_me
sign_in_and_redirect @user, event: :authentication
set_flash_message(:notice, :success, kind: "#{provider}".capitalize) if is_navigational_format?
else
session["devise.#{provider}_data"] = request.env["omniauth.auth"]
redirect_to new_user_registration_url
end
end
}
end
[:twitter, :facebook, :apple].each do |provider|
provides_callback_for provider
end
def failure
redirect_to root_path
end
endroutes.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
发布于 2022-10-21 13:28:04
TLDR;
要解决这个问题,只需将oauth 升级到最新版本即可。
bundle update oauth长版XD
在最近的一次升级之后,我遇到了同样的问题,但在我的示例中,我的模型没有使用devise进行管理,所以我决定进一步研究;在跟踪之后与涉及的gems进行了长时间的调试之后,我在oauth-1.0.0/lib/oauth/consumer.rb中的OAuth模块上发现了Consumer类的initialize方法中的一个错误。
# ensure that keys are symbols
@options = @@default_options.merge(options.transform_keys(&:to_sym))问题在于,在merge之后,@@default_options的键site和authorize_path仍然定义为字符串。
{"authorize_path"=>"/oauth/authenticate", "site"=>"https://api.twitter.com", "proxy"=>nil}因此,接收这些选项参数的其余代码和库无法正确找到用于获取端点的选项:site,从而返回类似于:
http://:80/request_token正如预期的那样,使用URI.parse解析字符串,就像在oauth_full_request_uri方法中在oauth-1.0.0/lib/oauth/client/net_http.rb中所做的那样,根本不返回主机,并引发问题中提到的错误。
所以我决定做这个小小的改变,一切都恢复正常了。
@options = @@default_options.merge(options).transform_keys(&:to_sym)我准备提出一个拉请求来帮助解决这个问题,我发现库的作者将回购移到了GitLab,并且发现他已经在使用snaky_hash库的最新版本中解决了这个问题XD,请看这里:
https://gitlab.com/oauth-xx/oauth/-/commit/7110a74690729b9abf8005cf0f58eedfc64f6ca3
因此,仅仅更新gem就足够了。希望这能帮到你们!
发布于 2022-09-28 10:16:38
此错误可能是由于Twitter返回用户配置文件映像的零值而导致的。这会导致错误,因为代码试图调用nil值的downcase方法。解决方案是将secure_image_url和image_size选项添加到omniauth.rb文件中的Twitter提供程序中。secure_image_url选项将确保图像URL始终以HTTPS的形式返回。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'
}
endhttps://stackoverflow.com/questions/73822206
复制相似问题