python 2.7 - Handling CSRF tokens in Django -
i've written small standalone python script that's calling django-based backend , working fine login , calling views requiring auth , on.
a bit of code
def dostuff(): session = login(username, password) license = add_license(session) def _helper(self, url, cookie=none): http = httplib2.http() if cookie: headers = { "cookie" : cookie } else: headers = {} response, content = http.request(host + url, "get", headers=headers, body="") return response, content def login(self, username, password): url = "/license/login?username=%s&password=%s" % (username, password) response, content = self._helper(url) sessioncookie = response["set-cookie"] customer_id = re.search("id=(?p<id>\d+)", content) if response["status"] == "200": return sessioncookie, customer_id.group("id") def add_license(self, session): cookie = session[0] customer_id = int(session[1])-1 url = "/license/add_license?customer_id=%s" % customer_id response, content = self._helper(url, cookie) content = content[1:-1] if response["status"] == "200": #ok data = json.loads(content) return data["fields"] if cahnge "get" "post" encounter django csrf-error page(csrf verification failed) in return. how can send post data django?
my login view in django, need special add csrf token? plan rewrite send json once things working.
def my_login(request): done, username = get_input(request, "username") if not done: return username done, password = get_input(request, "password") if not done: return password user = authenticate(username=username, password=password) if user not none: if user.is_active: login(request, user) return httpresponse("done, id=%s" % user.pk) else: return httpresponse("user disabled") else: return httpresponse("invalid login")
i got working , how did it. suggested toto_tico worte dummy view retrieve thought get csrf token. @ first didn't send csrf token on had add decorator ensure_csrf_cookie.
@ensure_csrf_cookie def dummy(request): return httpresponse("done") and handle login requests normally.
def my_login(request): ...handle login... it turned out adding cookie post wasn't enough, had write token post data well.
def _helper(self, url, method="post"): req = urllib2.request(host + url) self.cookiemgr.add_cookie_header(req) try: if method == "get": response = self.opener.open(req) else: cookie in self.cookiemgr: if cookie.name == "csrftoken": csrf = cookie.value values = { "csrfmiddlewaretoken" : csrf} params = urllib.urlencode(values) response = self.opener.open(req, params) code = response.getcode() info = response.info() content = response.read() return code, info, content except urllib2.httperror ex: print str(ex) sys.exit(1) def get_csrf(self): url = "/license/dummy" self._helper(url, method="get") def login(self, username, password): self.get_csrf() url = "/license/login?username=%s&password=%s" % (username, password) code, info, content = self._helper(url) if code == 200: #done!
Comments
Post a Comment