Jira API v2调用异常排查:FastAPI+Next.js架构下422及XSRF问题
Jira API代理请求错误修复方案
问题梳理
- 核心报错:422 Unprocessable Entity(请求体格式不被Jira接受)
- 服务器部署后:
- CORS模式触发XSRF校验失败
- no-cors模式返回422错误
- 本地运行:添加
X-Atlassian-Token: no-check后仍触发XSRF校验失败
具体修复步骤
1. 前端代码修正
no-cors模式会限制浏览器传递自定义头和读取响应内容,直接导致代理逻辑失效,必须改用默认的cors模式,同时确保请求体符合Jira API要求:
const response = await fetch("你的后端Proxy地址", { method: "POST", // 移除no-cors,默认即为cors模式 headers: { "Content-Type": "application/json", "X-Atlassian-Token": "no-check", "Target": "https://你的域名.atlassian.net/rest/api/2/issue", Authorization: 'Basic 你的有效Token' }, // 替换为Jira要求的创建Issue格式,示例如下 body: JSON.stringify({ fields: { project: { key: "你的项目Key" }, summary: "测试Issue", description: "通过代理创建的测试Issue", issuetype: { name: "Task" } } }), redirect: 'follow' })
2. 后端代理代码修正
原代码对请求体的处理逻辑错误,导致转发给Jira的请求体格式混乱,同时调整头信息过滤规则避免触发XSRF:
from fastapi import FastAPI, Body, Header, Request from fastapi.middleware.cors import CORSMiddleware import requests app = FastAPI() # 配置CORS,允许所有来源、方法和自定义头 app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) @app.post("/proxy") async def proxy_post(request: Request, body: dict = Body(), target: str = Header(alias="Target")): # 过滤可能触发Jira XSRF校验的浏览器头,保留必要的认证和自定义头 headers = {} for key, value in request.headers.items(): lower_key = key.lower() if lower_key not in ['host', 'origin', 'referer']: headers[key] = value # 直接转发原始请求体字典,不要做字符串替换操作 response = requests.post(target, json=body, headers=headers) try: return response.json() except: return {"detail": response.text, "status_code": response.status_code}
3. 关键错误点说明
- 422错误根源:原前端请求体
{test: "Test"}完全不符合Jira创建Issue的格式要求,必须严格按照Jira API文档构造请求体。 - XSRF校验失败:通过代理转发时,需过滤浏览器的
Origin/Referer头,否则Jira仍会触发XSRF校验,X-Atlassian-Token: no-check头需完整转发。 - no-cors模式问题:该模式会限制请求头传递和响应内容读取,导致代理无法正常工作,绝对不能使用。
内容的提问来源于stack exchange,提问作者TonyShark007
相关产品推荐
相关产品推荐

