Verwenden Sie Friend für die Authentifizierung und Autorisierung in einer Clojure-Webanwendung

8

Ich versuche, die Authentifizierung und Autorisierung von Freunden in eine einseitige Clojure / Compojure-Webanwendung zu integrieren.

Ich habe ein Login-Formular, das von einem Angular-Controller unterstützt wird, und dieser Controller verwendet AJAX, um den Benutzernamen und das Passwort für die Webanwendung zu authentifizieren und einen authentifizierten Benutzerdatensatz zu erhalten. Aus diesem Grund möchte ich nicht das Standardverhalten, das von der formularbasierten Friend-Anmeldung bereitgestellt wird. Ich möchte mich im Wesentlichen auf HTTP-Statuscodes verlassen und möchte nicht eine der Friend-Seitenweiterleitungen.

Zum Beispiel sollte eine nicht authentifizierte Anfrage einfach einen 401-Statuscode zurückgeben und nicht zu "/ login" umleiten. Ich habe diesen Teil funktioniert, indem Sie einen benutzerdefinierten ": nicht authentifizierten Handler" bei der Konfiguration von Friend (Code unten enthalten) angeben.

Bei einer erfolgreichen Anmeldung möchte ich nur einen 200-Statuscode und keine Umleitung auf die ursprünglich angeforderte Seite. Das ist, was ich nicht arbeiten kann.

Ich habe einen benutzerdefinierten Freund-Authentifizierungs-Workflow basierend auf den verschiedenen Beispielen geschrieben (meine Clojure-Fähigkeiten sind jetzt Anfängerlevel):

%Vor%

Hier ist mein Handler mit Middleware erklärt:

%Vor%

Und die zusätzliche Handler-Funktion, auf die oben Bezug genommen wird:

%Vor%

Abschließend ein zusätzliches Routenfragment zum Testen der Authentifizierung:

%Vor%

Dies meist funktioniert, und fast tut alles, was ich brauche.

Weil "redirect-on-auth?" ist in "make-auth" wahr, bei einer erfolgreichen Anmeldung wird eine Seitenumleitung erzeugt - ich möchte diese Umleitung verhindern, also setze ich den Wert auf false. Diese einzelne Änderung führt jedoch zu einer 404 und einer fehlgeschlagenen Anmeldung.

So wie die Friend-Authentifizierungskarte muss ich hier einen Statuscode von 200 zurückgeben, und ich möchte auch den "user-record" im Antworttext zurückgeben, damit die Clientanwendung die Benutzeroberfläche abhängig vom Benutzer anpassen kann Rollen (Ich habe bereits JSON-Anfragen / Antworten eingepackt und funktioniert).

Also ich denke, ich brauche das Äquivalent davon, wenn ich die Friend "make-auth" -Funktion aufrufen:

%Vor%

Es sieht jedoch so aus, als könnte ich entweder die Authentifizierungskarte oder die Antwort haben - aber nicht beides zusammen.

Kann das mit Freund erreicht werden und wenn ja wie?

    
caprica 28.11.2013, 19:00
quelle

2 Antworten

1

Sie müssen :redirect-on-auth? als false haben, und Sie müssen Ihre Antwort in eine Antwortkarte {:status 200 :body (workflows/make-auth...)} einbinden. Beachten Sie, dass Sie Ihren Körper wahrscheinlich zu einem String oder etwas anderem, das gehandhabt werden kann, serialisieren müssen.

    
ponzao 28.11.2013 21:02
quelle
1

Ich habe eine funktionierende Lösung für Ihr Problem erstellt. Der Schlüssel besteht darin, sicherzustellen, dass Sie einen Status, einen Textkörper und die Authentifizierungsdaten als Antwort zurückgeben. Du möchtest also zurückkehren

%Vor%

Das Problem mit der obigen Lösung besteht darin, dass die Sitzungsergebnisse in den Body anstatt in die Ringantwort selbst zusammengeführt werden. Gist

%Vor%     
rileyfreeman 10.05.2014 15:25
quelle