我想为现有的应用程序构建API。生成了特殊身份验证令牌并将其添加到我的数据库中。问题是,当用户应用程序发送的令牌与数据库中定义的令牌进行比较时,我得到了这样的错误:
NameError(未初始化的常量ActiveSupport :: SecurityUtils): app / controllers / api / v1 / base_controller.rb:64:在`authenticate_user!'
渲染 /home/snow/.rvm/gems/ruby-2.0.0-p643/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_source.erb (25.4ms)
渲染 /home/snow/.rvm/gems/ruby-2.0.0-p643/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_trace.erb (为0.8ms)
渲染 /home/snow/.rvm/gems/ruby-2.0.0-p643/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (29.9ms)
渲染 /home/snow/.rvm/gems/ruby-2.0.0-p643/gems/actionpack-4.0.2/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb救援/布局(74.0ms)
在Web上搜索答案,似乎可能是由于Rails版本和secure_compare
方法不兼容造成的。 (我的应用程序是基于Rails 4.0.2而需要使用Rails 4.2.0。)rails是否为我的问题升级唯一的解决方案,还是有其他方法可以在不使用ActiveSupport::SecurityUtils
的情况下安全地比较令牌?
验证码在这里:
def authenticate_user!
token, options = ActionController::HttpAuthentication::Token.token_and_options(request)
user_phone_number = options.blank?? nil : options[:phone_number]
user = user_phone_number && User.find_by(phone_number: user_phone_number)
if user && ActiveSupport::SecurityUtils.secure_compare(user.authentication_token, token)
@current_user = user
else
return unauthenticated!
end
end