
Python 使用 requests 模拟接口请求,登录接口会返回一个 token ,将这个 token 放入第二个接口请求头 authorize 中即可返回数据。登录接口响应体的 content-type: text/html; charset= ,我使用以下代码解码:
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 年 8 月 5 日 加个 time.sleep 试试,说不定是因为手动复制多了个延时... |
2 arischow 2023 年 8 月 5 日 via iPhone 看 devtools ,把能成功返回的 200 的 request headers 都放到代码里的构造体,一个一个排除原因 |
3 yzql2018 OP @arischow 怪我没说清楚,这些都是发生在本地 IDE 里的。所以可以排除 headers 的问题。就是将 Python 解码后字符串直接复制到代码定义一个变量可以返回 200 ,但是直接解码后的 token 变量放入第二个接口的请求头就诡异的返回 403 。诡异就诡异在这里,解码的跟我手动复制的是一个字符串啊,区别就是一个复制了一遍,一个解码后直接赋给一个变量。 |
4 15855pm 2023 年 8 月 5 日 token = response_json["accessToken"] 断点看一下这个变量是不是 str 类型呗,其实还有个思路是配置一下抓包,对比两次请求的差异就知道了 |
5 hsfzxjy 2023 年 8 月 5 日 via Android 建议把两次的二进制表示都打出来比较,你看到的不一定是你看到的 |
9 yzql2018 OP 抓包也抓过了,用对比工具对比了一下两种情况的请求体,结果都一样。各位大哥,救救小弟啊!怎么会有这么诡异的问题啊! |
10 xinqianbobo 2023 年 8 月 6 日 可以的话,贴点图更好判断发现问题 跨域了? |
11 yzql2018 OP @xinqianbobo 没有啊,登录和后续接口都在一个域名下面,其他接口带 token 认证都 200 ,这个接口带 token 认证返回 403 。复制 token 认证返回 200 。 |