Rails, OAuth, e proteção CSRF
-
12-09-2019 - |
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:
-
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.
-
Criar Rails ações especiais (por exemplo
UsersController#update_oauth
) que delegar internamente para as ações regulares (por exemploUsersController#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. -
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?
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