Pergunta

Eu estou usando REST e OAuth para falar com um aplicativo Rails (a partir de um aplicativo para o iPhone, mas isso não deve ser relevante). No entanto, eu estou correndo em alguns problemas com a proteção CSRF Rails (via protects_from_forgery).

Eu entendo que a proteção CSRF apenas entra em ação para submissões de forma regular (ou seja, Content-Type = application / x-www-form-urlencoded), então eu seria bom se eu estava enviando dados JSON ou XML. Infelizmente, OAuth está actualmente limitada a solicitações / x-www-form-urlencoded aplicação. Há um projecto de especificação que se estende OAuth para não- dados urlencoded de forma , mas isso não me ajuda agora.

A forma como eu vejo, eu tenho as seguintes opções:

  1. Enviar os dados como JSON, sabendo que não seria parte da assinatura OAuth e, portanto, sujeitos a ataques man-in-the-middle. Obviamente, não uma solução atraente.

  2. Criar Rails ações especiais (por exemplo UsersController#update_oauth) que delegar internamente para as ações regulares (por exemplo UsersController#update). Em seguida, excluí-las da proteção falsificação (protects_from_forgery :only => [:update]). Isso deve funcionar e pode ser avaliado como marginal aceitável para uma ou duas ações, mas, obviamente, seria uma solução muito confuso.

  3. Substituir a proteção Rails CSRF para ignorar os pedidos OAuth. Eu não tentei isso, mas parece que deve ser possível mudar um dos ganchos (talvez o filtro verify_authenticity_token) considerar OAuth solicita bem sucedido.

Alguém correr para isso antes? Quaisquer recomendações? Ou estou faltando alguma coisa, talvez básico?

Foi útil?

Solução

Eu vou responder minha própria pergunta. :)

Eu adicionei o seguinte método para nossas extensões controlador OAuth. A única coisa que este acrescenta no topo da implementação padrão é a verificação oauth?. Isto parece fazer o truque e se sente como uma solução bastante limpo.

def verify_authenticity_token
  verified_request? || oauth? || raise(ActionController::InvalidAuthenticityToken)      
end
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top