Pregunta

Estoy usando REST y OAuth para hablar con una aplicación Rails (a partir de una aplicación para el iPhone, pero eso no debería ser relevante). Sin embargo, estoy corriendo en algunos problemas con la protección CSRF Rails (a través de protects_from_forgery).

Yo entiendo que la protección CSRF solamente entra en acción para las presentaciones regulares de forma (es decir, Content-Type = application / x-www-form-urlencoded), por lo que estaría bien si me presento datos JSON o XML. Por desgracia, OAuth se limita actualmente a las solicitudes de aplicación urlencoded-x-www-form /. Hay una proyecto de especificaciones que se extiende a la no OAuth forma urlencoded datos , pero esto no me ayuda en este momento.

La forma en que lo veo, tiene las siguientes opciones:

  1. Enviar los datos como JSON, sabiendo que no sería parte de la firma de OAuth y por lo tanto sujetos a ataques man-in-the-middle. Obviamente no es una solución atractiva.

  2. Crea acciones Rieles especiales (por ejemplo UsersController#update_oauth) que delegar internamente a las acciones regulares (por ejemplo UsersController#update). Entonces excluirlos de la protección de la falsificación (protects_from_forgery :only => [:update]). Esto debería funcionar y podría ser el límite aceptable para una o dos acciones, pero, obviamente, sería una solución muy desordenado.

  3. Anular la protección CSRF rieles hacer caso omiso de las peticiones de OAuth. No he probado esto, pero parece que debería ser posible cambiar uno de los ganchos (quizás el filtro verify_authenticity_token) a considerar las solicitudes de OAuth éxito.

Alguien ha funcionado en esto antes? ¿Alguna recomendación? O tal vez estoy perdiendo algo básico?

¿Fue útil?

Solución

Voy a responder a mi propia pregunta. :)

I añadido el siguiente método para nuestras extensiones controlador OAuth. La única cosa que este añade en la parte superior de la aplicación por defecto es el cheque oauth?. Esto parece hacer el truco y se siente como una solución bastante limpio.

def verify_authenticity_token
  verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
end
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top