分两部分发布请求以获取CSRF令牌,然后再次发出请求

时间:2019-05-30 12:25:32

标签: python python-requests

我正在尝试通过首先登录以下站点来访问数据: https://accessns.nscorp.com/accessNS/login/

似乎将请求发送到后端:

当我使用python发送该请求时,我可以使用CSRF令牌获得响应。

接下来,我要访问:

采用以下标头:

  • 接受: /
  • 接受编码:gzip,deflate,br
  • 接受语言:en-US,en; q = 0.9
  • 连接:保持活动
  • 内容长度:58
  • 内容类型:application / json
  • Cookie:[一些cookie]
  • CSRFTOKEN:[来自上面的身份验证请求]
  • 主机:accessns.nscorp.com
  • 来源:https://accessns.nscorp.com
  • 引荐来源:https://accessns.nscorp.com/accessNS/legacy/
  • 用户代理:Mozilla / 5.0(Windows NT 10.0; WOW64)AppleWebKit / 537.36(KHTML,例如Gecko)Chrome / 73.0.3683.103 Safari / 537.36

有效载荷: {userId:“用户名”,classCode:“ classcode”,stationCode:“ stationcode”}

当我尝试将CS​​RF令牌和cookie从授权请求使用到辅助请求中时,我的代码失败,但是当我手动登录该站点,获取令牌/ cookie并将其硬编码到python中时,它不会失败。实际上,对于次请求的标头,我需要的只是CSRF令牌和cookie,以获取可行的响应。

with requests.Session() as s:

    login = {'Id': 'username', 'pwd': 'password'}
    auth = s.post('https://accessns.nscorp.com/accessNS/rest/auth/login', 
                   json=login)


    headers = {}
    headers['CSRFTOKEN'] = auth.json()['response']['token']
    headers['Cookie'] = '; '.join('='.join((i.name, i.value)) for i in 
                                  auth.cookies)


    payload = {'userId': 'username', 'classCode': 'classcode', 
               'stationCode': 'stationcode'}

    url = 
    'https://accessns.nscorp.com/accessNS/rest/backend/ServicesIndustrial/ 
     services/industrial2/v2/onsite/details'

    inv= s.post(url, json=payload, headers=headers)

    print(inv.json())

我希望得到我请求的数据的json响应,但是,使用我的代码,我得到:

{“时间”:1559217902355,“消息”:“对象参考未设置为对象的实例。。参考号:1559217902355”,“原因”:“无效的用户输入”,“ isError”:True},在我看来,这似乎是我的标头/有效载荷存在问题,或者我缺少中间步骤。

当我对csrf令牌/ cookie进行硬编码并且不使用请求会话时,我会得到想要的响应。

1 个答案:

答案 0 :(得分:0)

弄清楚了,我的代码工作正常。原来是对错误的URL发出了次要请求,这很奇怪,因为这是我检查过的每个开发人员控制台中列出的内容。