如何登录Symphony后端GraphQL API?Postman/Python/n8n获取Token
解决SuiteCRM 8.x API登录的CSRF Token问题
核心原因
SuiteCRM 8.x的Symfony后端启用了CSRF保护机制,AngularJS前端会自动完成XSRF Token的获取与携带,但Postman、Python这类工具需要手动复刻这个流程,这就是你遇到401"Invalid CSRF token"错误的直接原因。
完整登录流程步骤
1. 先获取XSRF-TOKEN
在发起登录POST请求前,先发送GET请求到系统登录页面(比如url.com/login,或直接访问根路径url.com),后端会在响应的Cookie中返回XSRF-TOKEN字段。
- 必须保存此次响应的Cookie,后续所有请求都需要携带它。
2. 构造登录请求
发起POST请求到url.com/login时,需要同时满足以下条件:
- 请求头:添加
X-XSRF-TOKEN字段,值为第一步获取的XSRF-TOKEN的具体内容(注意是Cookie里的token值,不是Cookie字段本身);同时要包含Content-Type: application/json。 - 请求体:和浏览器请求一致的JSON格式,示例:
{"username":"你的用户名","password":"你的密码"}。 - Cookie:携带第一步获取的包含
XSRF-TOKEN的Cookie。
3. 处理后续身份验证(Bearer Token)
登录成功后,后端通常会返回用于后续请求的Bearer Token(可能在响应体、Set-Cookie字段或响应头的Authorization中)。后续访问/api/graphql时,需要将这个Token放在请求头的Authorization: Bearer <token>字段中,同时继续携带之前的Cookie(包括可能更新的XSRF-TOKEN)。
Postman中的具体操作
- 开启自动保存Cookie:在请求的「Settings」中勾选「Enable cookies」,这样第一步GET请求的Cookie会自动应用到后续请求。
- 第一步发送GET请求到
url.com/login,查看响应Cookie确认XSRF-TOKEN存在。 - 第二步构造POST登录请求:
- 头信息添加
X-XSRF-TOKEN,值填入Cookie里的XSRF-TOKEN内容; - 请求体选择raw-JSON格式,填入用户名密码的JSON字符串;
- 发送后返回200则表示登录成功。
- 头信息添加
- 后续GraphQL请求:添加
Authorization: Bearer <token>头(token从登录响应中提取),确保Cookie被自动携带。
Python代码示例(基于requests库)
import requests # 用Session自动管理Cookie,避免手动处理 session = requests.Session() # 1. 获取XSRF Token session.get("https://url.com/login") xsrf_token = session.cookies.get("XSRF-TOKEN") # 2. 发起登录请求 login_data = {"username": "你的用户名", "password": "你的密码"} login_headers = { "Content-Type": "application/json", "X-XSRF-TOKEN": xsrf_token } login_response = session.post("https://url.com/login", json=login_data, headers=login_headers) login_response.raise_for_status() # 检查登录是否成功 # 3. 提取Bearer Token(根据实际响应调整,示例从响应体提取) bearer_token = login_response.json().get("access_token") # 4. 调用GraphQL接口 graphql_data = {"query": "你的GraphQL查询语句"} graphql_headers = { "Authorization": f"Bearer {bearer_token}", "Content-Type": "application/json" } graphql_response = session.post("https://url.com/api/graphql", json=graphql_data, headers=graphql_headers) print(graphql_response.json())
关键注意点
- AngularJS默认会自动读取Cookie中的
XSRF-TOKEN,并在POST/PUT/DELETE请求中自动添加X-XSRF-TOKEN头,所以浏览器登录时无需手动操作,但工具必须模拟这个逻辑。 - Bearer Token和XSRF Token是两个独立的机制:XSRF Token用于防范跨站请求伪造,Bearer Token用于身份验证,后续GraphQL请求通常需要同时携带两者。
- 如果登录成功后未返回明确的Bearer Token,检查响应的Cookie,SuiteCRM可能通过session cookie维持登录状态,此时后续请求只需携带Cookie即可,无需额外的Bearer头。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

