0

django ベースのバックエンドを呼び出す小さなスタンドアロンの python スクリプトを作成しましたが、ログインや認証を必要とするビューの呼び出しなどですべてが正常に機能しています。

ちょっとしたコード

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"]

「GET」を「POST」に変更すると、Django CSRF エラー ページ (CSRF 検証に失敗しました) が表示されます。POST データを Django に送信するにはどうすればよいですか?

Django の私のログイン ビューで、csrf トークンを追加するために何か特別なことをする必要がありますか? 私の計画は、これを書き直して、問題が解決したら json を送信することです。

 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 is 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")
4

3 に答える 3

1

私はそれを機能させました。これが私がやった方法です。toto_tico で提案されているように、CSRF トークンを取得するために GET と考えて取得したダミー ビューを書きました。最初は GET 経由で csrf トークンを送信しなかったため、decorator ensure_csrf_cookie を追加する必要がありました。

@ensure_csrf_cookie
def dummy(request):
    return HttpResponse("done")

そして、ログイン要求を通常どおり処理します。

def my_login(request):
    ...handle login...

Cookie を POST に追加するだけでは不十分であることがわかりました。POST データにもトークンを書き込む必要がありました。

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:
            for 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 as 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!
于 2013-05-11T07:13:29.347 に答える
0

csrftokenDjango にリクエストを送信するときに、Cookie の値を追加する必要があります。@csrf_exemptまたは、Django バックエンドに追加して、これらのリクエストを受け入れることもできます。

于 2013-05-10T10:36:38.433 に答える
0

CSFR と ajaxについて読み始めます。私は通常、提供されたコードを使用して次のことを行います。

  1. csfr.js ファイルを作成する
  2. csfr.js ファイルにコードを貼り付けます
  3. 必要なテンプレート内のコードを参照|

テンプレートを使用していて、そこから拡張する base.html のようなものがある場合は、そこからスクリプトを参照するだけで、残りのプログラミングを心配する必要はありません。私の知る限り、これはセキュリティ上の問題を表すものではありません。

于 2013-05-10T12:19:14.217 に答える