python - 传递 REST API 身份验证令牌在 PostMan 但不是 Python 请求中工作
问题描述
我正在尝试使用 Python 请求通过 REST API 访问一些信息。我使用的 API 需要身份验证,在登录请求之后,响应将包含一个会话 ID,该 ID 应该包含在所有未来请求的标头中。API 文档指出:
身份验证成功后,将返回带有访问令牌的 JSON 响应。需要在所有后续请求的标头中设置令牌才能成功处理它们。API 客户端应该添加一个名为“blabla_session_id”的 HTTP 标头,与 Web 应用程序中的 cookie 名称相同
我能够成功发送登录请求并接收带有会话 ID 的响应,但是我无法使用 Python 请求将会话 ID 添加到标头。我正在使用以下代码:
# Functions
def login(base_url, username, password):
print("Getting token...")
header = {'content-type':'application/json'}
data_get = {'email': username,
'password':password,
'workspaceId':12345678}
r = requests.post(base_url+'login', headers=header, json=data_get)
if r.ok:
print("Login Success!")
global session_id
session_id = r.cookies['blabla_session_id']
print("Session ID is %s" %session_id)
else:
print("Login Fail...")
print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))
def logout():
header = {'blabla_session_id':session_id,'content-type':'application/json'}
print (header)
r = requests.put(base_url+'logout', headers=header)
print (r.request.headers)
if r.ok:
print("Logout Success")
else:
print("Logout Failed")
print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))
def main():
login(base_url, api_login, api_password)
logout()
# Main Program
main()
当我执行此操作时,我得到以下响应:
Getting token...
Login Success!
Session ID is LABS-FReGnWuzzj7oYQ4nzPdvB55rOpctU48s%7C
{'blabla_session_id': 'LABS-FReGnWuzzj7oYQ4nzPdvB55rOpctU48s%7C', 'content-type': 'application/json'}
{'User-Agent': 'python-requests/2.25.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'blabla_session_id': 'LABS-FReGnWuzzj7oYQ4nzPdvB55rOpctU48s%7C', 'content-type': 'application/json', 'Content-Length': '0'}
Logout Failed
HTTP 401 - , Message {"status":401,"errors":[{"code":401,"message":"There is no access token associated with this request or the access token is not valid."}]}
有什么想法我哪里出错了吗?正如标题所暗示的,我确实尝试使用 PostMan 来验证 API,并且我能够登录、将会话 ID 添加到标题中并没有问题地注销。我怀疑这与标题的格式有关,但我不确定。
解决方案
转而使用单个请求session
,这将在所有 http 操作中传播特别是 cookie,确保成功的身份验证被传递到所有请求中。
例如:
import requests
def login(s,base_url, username, password):
print("Getting token...")
header = {'content-type':'application/json'}
data_get = {'email': username,
'password':password,
'workspaceId':12345678}
r = s.post(base_url+'login', headers=header, json=data_get)
if r.ok:
print("Login Success!")
global session_id
session_id = r.cookies['blabla_session_id']
print("Session ID is %s" %session_id)
else:
print("Login Fail...")
print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))
def logout(s):
header = {'blabla_session_id':session_id,'content-type':'application/json'}
print (header)
r = s.put(base_url+'logout', headers=header)
print (r.request.headers)
if r.ok:
print("Logout Success")
else:
print("Logout Failed")
print("HTTP %i - %s, Message %s" % (r.status_code, r.reason, r.text))
def main():
s = requests.session()
login(s,base_url, api_login, api_password)
logout(s)
# Main Program
main()
推荐阅读
- javascript - SetInterval - 到达下一分钟时更改间隔
- vhdl - VHDL 中的多路复用器 8x1
- java - 如何将“spring boot 2.1 with elasticsearch 6.6”与集群节点“https”连接起来?
- macos - OSX - 启动可执行文件时如何不显示终端窗口?
- java - 用于删除 Postgres SQL 中逻辑冗余条目的 Cron 作业
- python - Pygame 窗口冻结并停止响应,我该如何解决这个问题?
- spring - Spring Cloud Gateway:禁用默认路由
- angular - 需要在一个表单中添加两个控件值,Angular
- javascript - 按对象中数组的总和排序
- java - Java 正则表达式不匹配字符串“abc.txt”与模式“abc”