两部分post请求获取CSRF令牌,然后进行另一个请求

2024-06-28 19:31:14 发布

您现在位置:Python中文网/ 问答频道 /正文

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

它似乎将此请求发送到后端:

当我用python发送请求时,我能够用CSRF令牌得到响应。你知道吗

接下来,我想访问:

其中包含以下标题:

  • 接受:/
  • 接受编码:gzip、deflate、br
  • 接受语言:en-US,en;q=0.9
  • 连接:保持活动
  • 内容长度:58
  • 内容类型:application/json
  • 饼干:[一些饼干]
  • CSRFTOKEN:[来自上面的身份验证请求]
  • 主持人:访问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:“username”,classCode:“classCode”,stationCode:“stationCode”}

当我试图将授权请求中的CSRF令牌和cookie用于辅助请求时,我的代码失败了,但是当我手动登录到站点,获取令牌/cookie,并将它们硬编码到python中时,代码没有失败。实际上,就secodary请求的头而言,我所需要的只是CSRF令牌和cookies,以获得可行的响应。你知道吗

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响应,但是,使用我的代码,我得到:

{'time':1559217902355,'message':'对象引用未设置为对象的实例。。参考号:1559217902355,''原因':'无效用户输入','isError':True},在我看来,这似乎是我的头/负载有问题,或者我缺少一个中间步骤。你知道吗

当我硬编码csrf令牌/cookies并且不使用请求会话时,我得到了我想要的响应。你知道吗


Tags: 代码httpscomauthrestjson编码username
1条回答
网友
1楼 · 发布于 2024-06-28 19:31:14

算了吧,我的代码运行得很好。原来第二个请求是对错误的URL发出的,这很奇怪,因为我检查过的每个开发人员控制台中都列出了这个URL。你知道吗

相关问题 更多 >