Verhindern Sie, dass Expressjs eine Sitzung erstellt, wenn Anforderungen einen Autorisierungsheader enthalten?

8

Ich habe eine API, die entweder mit einem Browser aufgerufen werden kann, wo Anfragen transaktional sind und eine Sitzung ODER direkt haben, z. Verwenden von Curl, wobei Anforderungen atomar sind. Browser-Anfragen müssen zuerst authentifiziert werden und dann eine Express-Sitzung (connect.sid) für die nachfolgende Autorisierung verwenden, direkte API-Aufrufe verwenden eine Kopfzeile: Authorization: "SOMETOKEN" , die für jede Anfrage gesendet werden muss.

Das Problem, das ich habe, ist, weil ich den gleichen Webserver verwende, um sowohl atomaren als auch transaktionalen Verkehr zu bedienen, wird jedem API-Aufruf unnötigerweise eine Sitzung von Express gegeben. Jede Antwort enthält einen Set-Cookie und alle diese Sitzungen füllen meinen Sitzungsspeicher. Daher: Wie kann ich verhindern, dass Express einen neuen Schlüssel im Speicher (Redis) eingibt, wenn eine Anfrage einen Autorisierungskopf enthält?

Hinweis. Ich denke, dass ein klassischerer Ansatz ein separater API-Server und ein separater WEB-Server wäre, aber warum nicht beide auf einem Rechner laufen? Für mich besteht der Unterschied darin, dass die API Daten bereitstellt und das WEB Ansichten bereitstellt, aber darüber hinaus beide Teil derselben Anwendung sind. Ich erlaube gerade zufällig Benutzern auch, direkt auf ihre Daten zuzugreifen und sie nicht zu zwingen, meine Schnittstelle zu benutzen.

Express-Konfiguration

%Vor%

Eine Beispielroute

%Vor%

Autorisierungs-Middleware

%Vor%     
Oliver Lloyd 21.01.2014, 17:20
quelle

4 Antworten

14

Versuchen Sie Folgendes:

%Vor%     
robertklep 23.01.2014, 18:28
quelle
1

Sieht so aus, als müssten Sie Ihre eigene Session-Middleware schreiben. Hier ein Beispiel . Wenn Sie eine separate Subdomain erstellen können, z. B. www.example.com für Browsersitzungen und app.example.com für den direkten Zugriff darauf, sollten Sie die verknüpfte Methode fast genau verwenden können und die Sitzung einfach nicht starten für app.example.com Anfragen. Dies kann die direkteste Methode sein, bei der der Anruf die Methode angibt, mit der er sich authentifizieren will, und jede Abweichung von dieser ist ein Fehler.

Andernfalls müssen Sie das Authentifizierungstoken in der Middleware erkennen und die Sitzung nicht starten, wenn Sie sie finden.

    
Jason 23.01.2014 18:25
quelle
1

Ein alternativer Ansatz zum Reduzieren der Anzahl von Sitzungen, die in Ihrem Sitzungsspeicher gespeichert sind, besteht darin, einen Standard-maxAge auf einen niedrigen Wert zu setzen. Wenn Sie dann Sitzungen benötigen, die länger gespeichert werden müssen, z. B. nach einer Benutzeranmeldung, können Sie req.session.cookie.expires = null; festlegen. Vergessen Sie auch nicht, den Sitzungsablauf auf einen niedrigen Wert zu setzen, wenn sich der Benutzer abmeldet.

Hier ist ein Beispiel:

%Vor%

Dies ist besonders nützlich, wenn Sie Ihre App fernüberwachen möchten. Wenn die Überwachung häufig genug ist, werden die Sitzungen schnell voll.

    
eddywashere 25.10.2014 21:19
quelle
-1

Sie können immer nur das Antwort-Header-Ereignis abfangen und den Header 'set-cookie' entfernen:

%Vor%

Sie können das technisch überall in Ihre Middleware-Kette einfügen.

    
lxe 21.01.2014 19:00
quelle