Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 设计用户登录给出CSRF令牌真实性令牌的身份验证错误_Ruby On Rails_Ruby On Rails 4_Devise_Csrf_Rails Api - Fatal编程技术网

Ruby on rails 设计用户登录给出CSRF令牌真实性令牌的身份验证错误

Ruby on rails 设计用户登录给出CSRF令牌真实性令牌的身份验证错误,ruby-on-rails,ruby-on-rails-4,devise,csrf,rails-api,Ruby On Rails,Ruby On Rails 4,Devise,Csrf,Rails Api,我正在使用Desive最新版本-3.2.0和rails最新版本-4.0.1 我正在进行没有ajax或api的简单身份验证,并得到了CSRF真实性令牌的错误。检查下面的POST请求 于2013-11-08 19:48:49+0530开始发布/用户/登录127.0.0.1 Desive::SessionControllerCreate作为HTML处理 参数:{utf8=>✓, 真实性令牌=>SJNGHXXUXJNCPCPCDG3MUV2GYCA8CX2LVV78PQDDD4=,用户=> {电

我正在使用Desive最新版本-3.2.0和rails最新版本-4.0.1

我正在进行没有ajax或api的简单身份验证,并得到了CSRF真实性令牌的错误。检查下面的POST请求

于2013-11-08 19:48:49+0530开始发布/用户/登录127.0.0.1 Desive::SessionControllerCreate作为HTML处理 参数:{utf8=>✓, 真实性令牌=>SJNGHXXUXJNCPCPCDG3MUV2GYCA8CX2LVV78PQDDD4=,用户=> {电子邮件=>a@a.com,密码=>[FILTERED],记住_me=>0}, 提交=>登录} 无法验证CSRF令牌的真实性 用户加载0.4ms从users.email= 'a@a.com“限制1 0.1ms开始事务 SQL 0.4ms更新用户设置最后一次签名,当前签名?, 在计数=?中签名,在=?处更新?其中users.id=2[[last_sign_in_at,Fri, 2013年11月8日14:13:56 UTC+00:00],[当前登录时间:2013年11月8日星期五14:18:49 UTC +00:00],[登录计数,3],[更新日期:2013年11月8日星期五14:18:49 UTC+00:00]] 143.6ms提交事务 重定向到http://localhost:3000/ 在239ms ActiveRecord中找到已完成的302:144.5ms |搜索:0.0ms 根url指向homenew,如下所示

class HomeController < ApplicationController
   before_action :authenticate_user!
   def index
   end
end
在页面生成的html视图中签名如下:

元标记

形式


当CSRF令牌不正确时,Rails将不会读取或更新会话。它仍将执行控制器指定的任何其他操作,这解释了为什么您看到数据库更新但最终没有登录

我注意到您的日志和页面中的Authentity_标记不匹配。我意识到这可能是因为您捕获了一个不同的请求,但是您应该检查页面上的请求是否与同一请求的日志中的请求相匹配。我还假设您在视图中使用了适当的标记,每次都会生成不同的Authentity_标记,而不仅仅是对HTML输入进行硬编码

你认为与Desive无关的表单也存在同样的问题吗?如果不是,作为一种解决方法,您可以使用控制器中的以下代码将您的操作从CSRF检查中豁免:

protect_from_forgery except: :sign_in

CSRF攻击您的sign-in action的几率似乎很小Desive gem没有问题。我删除了“rails api”gem,我的应用程序开始工作。

我修复了相同的问题,只是删除了视图中的remote:true选项:更改了form\u formodel,remote:true到form\u formodel

将其添加到应用程序控制器上这在rails 5上工作

protect_from_forgery unless: -> { request.format.json? }
将此添加到Desive SessionController

skip_before_action :verify_authenticity_token, only: [:create]
试试卷发

curl -X POST -v -H 'Content-Type: application/json' http://0.0.0.0:3000/users/sign_in -d '{"user" : {"email": "name@mail.com", "password": "secret" }}'

几个月前我遇到了一个类似的问题,我可以通过删除浏览器中的所有cookie和缓存来解决。希望你也是这样,也许是这样。让我试试。即使在清除缓存和cookies后,它也不起作用。我甚至可以在不同的浏览器中浏览。你能在注册页面上发表你的观点吗?并且也在你的application.html.erb文件中?我已经用生成的视图更新了我的问题html代码.log和表单真实性标记不同,因为我在问题后面添加了视图/表单部分的代码。我现在刚刚检查过,两者都是一样的,所以我认为上述问题不应该是这样。我没有这个宝石,但我有同样的问题。试着删除一些其他宝石,检查这是否纠正了问题。我很确定它的到来主要是因为一些其他的双子座,我很想知道rails api的哪一部分干扰了Desive,rails 5是如何实现rails api本机的,现在呢=这是一个非常老的问题,我没有解决这个问题的代码库。我无法提供更多的细节。