2017-07-17 5 views
0

Aus irgendeinem Grund ändert sich nach dem Einloggen jeder POST-Request nach dem Twisted-Session-Cookie. Warum passiert das? Ich würde erwarten, dass die Sitzungs-UID die gleiche bleibt, bis die Verbindung unterbrochen wird oder sich der Benutzer abmeldet.Twisted-Session-Cookie ändert sich für jede Anfrage

Hier ist mein Code, der die Sitzung für jede Anforderung werden unterschiedliche Ursachen:

from twisted.web.server import Site, http 
from twisted.internet import reactor 
from twisted.web.resource import Resource 

import json 

class HttpResource(Resource): 
    isLeaf = True 

    def render_OPTIONS(self, request): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 
     return "" 

    def render_GET(self, request): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 
     return "<html><body style='margin: 0; overflow: hidden;'><iframe style='width: 100%; height: 100%; border: none;' src='http://tsa-graphiql.herokuapp.com/'></iframe></body></html>" 

    def render_POST(self, request): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 

     session_id = request.getSession().uid 
     print "HttpResource session ID: {}".format(session_id) 


class LoginResource(Resource): 
    isLeaf = True 

    def render_OPTIONS(self, request): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 
     return "" 

    def render_GET(self, request): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 
     return "<html><body style='margin: 0; overflow: hidden;'><iframe style='width: 100%; height: 100%; border: none;' src='http://tsa-graphiql.herokuapp.com/'></iframe></body></html>" 

    def render_POST(self, request): 
     log("Login request") 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 

     req = request.content.read() 

     session_id = request.getSession().uid 

     try: 
      jsQ = json.loads(req) 
     except Exception as e: 
      return e 

     # User credentials 
     username = jsQ['username'] 
     password = jsQ['password'] 

     # Authenticate the User 
     if username == 'test' and password == 'test': 
      # Create a new session 
      print "Login session ID: {}".format(session_id) 
     else: 
      request.setResponseCode(401) 
      return "Invalid username or password" 


class RefreshResource(Resource): 
    isLeaf = True 

    def render_OPTIONS(self, request): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 
     return "" 

    def render_GET(self, request): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 
     return "<html><body style='margin: 0; overflow: hidden;'><iframe style='width: 100%; height: 100%; border: none;' src='http://tsa-graphiql.herokuapp.com/'></iframe></body></html>" 

    def render_POST(self, request): 
     request.setHeader('Access-Control-Allow-Origin', '*') 
     request.setHeader('Access-Control-Allow-Headers', 'Origin, Accept, content-type, authorization') 
     print "Refresh session ID: {}".format(request.getSession().uid) 


class HttpFactory(Site): 

    def __init__(self, resource): 
     http.HTTPFactory.__init__(self) 
     self.resource = resource 
     self.sessions = {} 
     self.user_info = {} 


if __name__ == '__main__': 

    root = Resource() 
    root.putChild("", HttpResource()) 
    root.putChild("login", LoginResource()) 
    root.putChild("refresh", RefreshResource()) 

    site = HttpFactory(root) 
    reactor.listenTCP(8000, site) 

    reactor.run() 

Antwort

1

Twisted-Web-Sessions Cookies in Ihrem Browser sind. Damit die Sitzung mit einem Client aktiv bleibt, müssen sie die Antwort des Servers Set-Cookie respektieren (speichern Sie den Cookie und senden Sie ihn erneut mit zukünftigen Anfragen).

Wenn Ihr Kunde etwas wie curl ist, dann gilt:

$ curl http://localhost:8000/ 

wird nach dem Ausführen der Session-Cookie fallen. Wenn Sie diesen Befehl erneut ausführen, erhalten Sie eine neue Sitzung, da der Client das Sitzungscookie nicht sendet und der Server nicht wissen kann, ob die Anforderung zur zuvor erstellten Sitzung gehört.

Wenn Sie curl sagen, Cookies behandeln normalerweise mit einem Befehl wie:

$ curl --cookie session-cookies --cookie-jar session-cookies http://localhost:8000/ 

Dann locken wird den Session-Cookie der Server-Sets speichern. Wenn Sie den Befehl erneut ausführen, wird das Sitzungscookie zurück an den Server gesendet und Sie sehen, dass dieselbe Sitzung erneut verwendet wird.

+0

Okay ich sehe. Wenn also der verdrehte Code den Cookie in der Kopfzeile setzt, sollte die Benutzeroberfläche diesen Cookie mit jeder Anfrage senden, bis die Sitzung beendet ist. Danke für die Erklärung Jean! – Brian

Verwandte Themen