Python 使用 requests 模拟接口请求,登录接口会返回一个 token ,将这个 token 放入第二个接口请求头 authorize 中即可返回数据。登录接口响应体的 content-type: text/html; charset=UTF-8 ,我使用以下代码解码:
response_json = json.loads(response.text)
token = response_json["accessToken"]
print(token)
将得到的 token 放入第二个接口的请求头中,按道理应该可以返回 200 的,但实际返回 403 错误。也就是 token 没通过验证。
诡异的事情来了,我在控制台将 token 输出并复制,然后在代码里将复制的 token 赋值给一个变量,放入第二个接口的请求头中,再次请求竟然返回 200 了。
对比了原始响应的值和 Python 解码后的值完全一样,反复几次都是如此,只要是手动复制的字符串就没问题,放入代码解码后的 token 变量就会 403 。
我都快怀疑人生了,各位大佬,有知道从哪个方面着手排除问题的吗?
token 本身是 base64 编码的,一个实例如下:
eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJyb2xlIjoiSW5kaXZpZHVhbCIsInVzZXJJZCI6IjZSbU9OREZ6QVBBWlgxaTc1TmVDcXc9PSIsImVtYWlsIjoiRjlmNmhYYXlNNVNsRGZMMDFPWFdwNlVpazZ3bnc0bXhLdVowbm9IaXd0eU1FaXRDbVQ4Z2dPUC8zU1QzbzZHWCIsIm5iZiI6MTY5MTIxMzAwMSwiZXhwIjoxNjkxMjE5MDAxLCJpYXQiOjE2OTEyMTMwMDF9.I0gBdO4xM0CPIW0_ifVGnq7PmyDTjXQJeh8iYgqsJ1iOA0-WHNvswN81_pUWQFOVJ9hlP-YM5M5dsLyP7Oc2Xw
编码后的字符串会有几个特殊符号,点、-、_、/ 。
1
Trim21 2023-08-05 13:49:38 +08:00
加个 time.sleep 试试,说不定是因为手动复制多了个延时...
|
2
arischow 2023-08-05 13:54:15 +08:00 via iPhone
看 devtools ,把能成功返回的 200 的 request headers 都放到代码里的构造体,一个一个排除原因
|
3
yzql2018 OP @arischow 怪我没说清楚,这些都是发生在本地 IDE 里的。所以可以排除 headers 的问题。就是将 Python 解码后字符串直接复制到代码定义一个变量可以返回 200 ,但是直接解码后的 token 变量放入第二个接口的请求头就诡异的返回 403 。诡异就诡异在这里,解码的跟我手动复制的是一个字符串啊,区别就是一个复制了一遍,一个解码后直接赋给一个变量。
|
4
15855pm 2023-08-05 14:19:16 +08:00
token = response_json["accessToken"]
断点看一下这个变量是不是 str 类型呗,其实还有个思路是配置一下抓包,对比两次请求的差异就知道了 |
5
hsfzxjy 2023-08-05 14:31:39 +08:00 via Android
建议把两次的二进制表示都打出来比较,你看到的不一定是你看到的
|
9
yzql2018 OP 抓包也抓过了,用对比工具对比了一下两种情况的请求体,结果都一样。各位大哥,救救小弟啊!怎么会有这么诡异的问题啊!
|
10
xinqianbobo 2023-08-06 21:34:19 +08:00
可以的话,贴点图更好判断发现问题
跨域了? |
11
yzql2018 OP @xinqianbobo 没有啊,登录和后续接口都在一个域名下面,其他接口带 token 认证都 200 ,这个接口带 token 认证返回 403 。复制 token 认证返回 200 。
|