代码之家  ›  专栏  ›  技术社区  ›  user590028

Django使用python请求进行身份验证

  •  0
  • user590028  · 技术社区  · 7 年前

    很难分辨如何正确验证 python-request POST . 我们的代码尝试先登录,然后使用我们建立的 python请求 会话到 岗位 数据,但我们的 请求总是未经验证的。

    # client.py
    LOGIN_URL = 'http://localhost/accounts/login'
    ADD_URL = 'http://localhost/add'
    
    import requests
    rqst = requests.session()
    rsp = rqst.get(LOGIN_URL)
    
    token = rsp.cookies['csrftoken']
    rsp = rqst.post(LOGIN_URL, auth=(uname, pwd),
            data={'csrfmiddlewaretoken':token, 'next':'/'})
    # at this point, rsp.status_code == 200 and we are logged in
    
    payload = {'foo':'bar', 'csrfmiddlewaretoken':token}
    rsp = rqst.post(ADD_URL, json=payload)
    # Error -- this post always returns 403 -> HttpResponseForbidden
    

    # view.py
    def view_add(request):
        if request.user.is_authenticated:
            return HttpResponseForbidden('not authenticated')
        ...
    

    我们在中启用了django会话 settings.py . 我们访问没有问题 GET 使用相同模式的视图。它是唯一的 岗位 我们遇到麻烦的地方。

    3 回复  |  直到 7 年前
        1
  •  1
  •   AKX Bryan Oakley    7 年前

    您的第二个POST请求没有CSRF令牌(即使登录请求有)。

    除非你的视线被标记 @csrf_exempt

        2
  •  1
  •   user590028    7 年前

    这个问题是由我对django身份验证的混淆引起的。Django身份验证是基于表单的,而 rqst.post(..., auth=(uname, pwd)) 是 basic authentication 默认情况下。

    因此,第一次调用 rqst.post()

    # client.py
    LOGIN_URL = 'http://localhost/accounts/login'
    ADD_URL = 'http://localhost/add'
    
    import requests
    rqst = requests.session()
    rsp = rqst.get(LOGIN_URL)
    
    token = rsp.cookies['csrftoken']
    rsp = rqst.post(LOGIN_URL, 
            data={'username':uname, 'password': pwd,  # <---- HERE IS FIX
            'csrfmiddlewaretoken':token, 'next':'/'})
    
        3
  •  1
  •   ESR    7 年前

    在我的项目的url.py中:

        urlpatterns = [
        path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
        ]
    

    因此,这不起作用: http://localhost:8000/login

    http://localhost:8000/login/

    ... 我花了很长时间才弄明白,所以我希望这能帮助别人。

    另外-有一篇非常好的Python scraping文章也帮助我找到了csrf令牌: https://kazuar.github.io/scraping-tutorial/