You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何登录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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:22:43