Ich habe eine Rails-API, die mit einem HTTP-only-Cookie authentifiziert ist, und als solches benötige ich CSRF-Schutz. Soweit ich das beurteilen kann, scheint es der Rails-Community vorzuziehen, jwt-Auth-Tokens lieber im lokalen Speicher als in einem Cookie zu speichern. Dies vermeidet die Notwendigkeit von CSRF, setzt Sie jedoch XSS zur Verfügung, weshalb wir uns dafür entschieden haben, cookies + csrf zu verwenden.So aktivieren Sie CSRF im Rails 5-API-Modus
Offenbar ist der CSRF-Schutz standardmäßig deaktiviert, da die Community lokalen Speicher bevorzugt. Ich versuche es mit begrenztem Erfolg zu ermöglichen. Hier ist, wie ich bin versucht, es zu handhaben:
module V1
class ApplicationController < ::ApplicationController
include Concerns::Authentication
include ActionController::RequestForgeryProtection
protect_from_forgery
protected
def handle_unverified_request
raise 'Invalid CSRF token'
end
after_action :set_csrf_cookie
def set_csrf_cookie
if current_user
cookies['X-CSRF-Token'] = form_authenticity_token
end
end
end
end
Auf der Client-Seite, ich kann sehen, dass das Token im Cookie kommt zurück. Wenn ich eine Anfrage mache, sehe ich auch, dass das Token im Header X-CSRF-Token
vorhanden ist. Alles sieht soweit gut aus.
Die Methode verified_request?
gibt jedoch false zurück, sodass handle_unverified_request
aufgerufen wird. Beim Durchlaufen des Rails-Codes sehe ich, dass mein Token in request.x_csrf_token
vorhanden ist, aber das Token scheint die Überprüfung nicht zu bestehen, wenn es mit der session
überprüft wird. Eine Sache, die ich mich hier wundere, ist, wenn ich etwas aktivieren muss, um die session
richtig funktionieren zu lassen, da ich weiß, dass die Sitzungsverwaltung nicht standardmäßig im API-Modus aktiviert ist. Aber wenn das der Fall wäre, würde ich erwarten, dass Versuche, auf das session
Objekt zuzugreifen, explodieren, und das tun sie nicht, also bin ich mir nicht sicher.
Habe ich einen Fehler gemacht, oder muss ich eine andere Middleware einschalten? Oder brauche ich überhaupt einen anderen Ansatz, um CSRF mit diesem Schema zu ermöglichen?