solucionar samsung producido problema porque error cómo celular autenticacion ruby-on-rails ruby-on-rails-4 devise csrf rails-api

ruby-on-rails - problema - se ha producido un error de autenticacion samsung



idear usuario sign_in da error de autenticación para token de autenticidad de token CSRF (4)

Agregue esto en el controlador de la aplicación (esto funciona en Rails 5)

protect_from_forgery unless: -> { request.format.json? }

Agregue esto al Devise SessionController

skip_before_action :verify_authenticity_token, only: [:create]

Pruébalo con rizo

curl -X POST -v -H ''Content-Type: application/json'' http://0.0.0.0:3000/users/sign_in -d ''{"user" : {"email": "[email protected]", "password": "secret" }}''

Estoy usando un devise (última versión - 3.2.0) con rails (última versión - 4.0.1)

Estoy realizando una autenticación simple (sin ajax o api) y obtengo un error para el token de autenticidad CSRF. Compruebe la solicitud POST a continuación

started POST "/users/sign_in" for 127.0.0.1 at 2013-11-08 19:48:49 +0530 Processing by Devise::SessionsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"SJnGhXXUXjncnPhCdg3muV2GYCA8CX2LVFV78pqddD4=", "user"=> {"email"=>"[email protected]", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"} Can''t verify CSRF token authenticity User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."email" = ''[email protected]'' LIMIT 1 (0.1ms) begin transaction SQL (0.4ms) UPDATE "users" SET "last_sign_in_at" = ?, "current_sign_in_at" = ?, "sign_in_count" = ?, "updated_at" = ? WHERE "users"."id" = 2 [["last_sign_in_at", Fri, 08 Nov 2013 14:13:56 UTC +00:00], ["current_sign_in_at", Fri, 08 Nov 2013 14:18:49 UTC +00:00], ["sign_in_count", 3], ["updated_at", Fri, 08 Nov 2013 14:18:49 UTC +00:00]] (143.6ms) commit transaction Redirected to http://localhost:3000/ Completed 302 Found in 239ms (ActiveRecord: 144.5ms | Search: 0.0ms)

La url de la raíz apunta al home#new , que es como

class HomeController < ApplicationController before_action :authenticate_user! def index end end

La vista html generada por la página Sign_in es como:

  • etiquetas meta

    <meta content="authenticity_token" name="csrf-param" /> <meta content="aV+d7Z55XBJF2VtyL8V3zupR3OwhaQ6UHNtlQLBQf5Y=" name="csrf-token" />

  • formar

    <form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"> <div style="margin:0;padding:0;display:inline"> <input name="utf8" type="hidden" value="&#x2713;" /> <input name="authenticity_token" type="hidden value="aV+d7Z55XBJF2VtyL8V3zupR3OwhaQ6UHNtlQLBQf5Y=" /> </div> <div><label for="user_email">Email</label><br /> <input autofocus="autofocus" id="user_email" name="user[email]" type="email" value="" /> </div> <div><label for="user_password">Password</label><br /> <input id="user_password" name="user[password]" type="password" /></div> <div><input name="user[remember_me]" type="hidden" value="0" /> <input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" /> <label for="user_remember_me">Remember me</label></div> <div><input name="commit" type="submit" value="Sign in" /></div> </form>

La solicitud de autenticación incluso actualiza los valores last_sign_in_at y sign_in_count , pero cuando intento acceder a current_user en el controlador aparece como nil .

De acuerdo a mi no se está iniciando sesión en el user . Pero luego surge la pregunta "¿por qué está actualizando el valor last_sign_in_at / sign_in_count en la tabla de user ?"


Cuando el token CSRF no es correcto, Rails no leerá ni realizará ninguna actualización de la sesión. Todavía realizará cualquier otra acción que especifique el controlador, lo que explica por qué ve la actualización de la base de datos pero no termina la sesión.

Me doy cuenta de que el identificador de autenticidad en su registro y en su página no coinciden. Me doy cuenta de que esto puede deberse a que capturó una solicitud diferente, pero debe verificar que la de la página coincida con la del registro para la misma solicitud. También supongo que está utilizando la etiqueta adecuada en su vista, que genera una autenticidad diferente en cada entrada y no solo codifica la entrada HTML.

¿Ves el mismo problema con los formularios no relacionados con el diseño? Si no, como solución alternativa, puede eximir su acción del CSRF con el siguiente código en su controlador:

protect_from_forgery except: :sign_in

Las probabilidades de un ataque CSRF contra su acción de inicio de sesión me parecen bastante remotas (<-pun).

Además, si es solo con un dispositivo, le sugiero que presente un problema con ellos, lo que ya ha hecho .


No hubo ningún problema con el diseño de la gema. Quité la gema ''rails-api'' y mi aplicación comenzó a funcionar.


Solucioné el mismo problema simplemente eliminando la opción "remoto: verdadero" a la vista: cambió form_for (model, remote: true) por form_for (model)