如何模拟登录Snipe-IT并自动创建个人API令牌?
解决Snipe-IT模拟登录中
_token字段的获取问题 核心结论
_token就是CSRF令牌,和后续创建API令牌需要的XSRF-TOKEN同源,都来自登录页面的HTML内容里。
具体步骤(curl测试版)
请求登录页面获取CSRF令牌与初始Cookie
发送GET请求到登录页面,从返回的HTML中提取_token,同时保存返回的Cookie(包含XSRF-TOKEN和snipeit_session初始值):# 保存登录页面到临时文件,同时记录Cookie到cookie.txt curl -c cookie.txt http://my-snipit-instance/login > login_page.html # 从页面meta标签提取CSRF令牌(Laravel框架标准写法) CSRF_TOKEN=$(grep -o '<meta name="csrf-token" content="[^"]*"' login_page.html | awk -F '"' '{print $4}')如果页面中
_token是直接放在表单的隐藏字段里,也可以用这个命令提取:CSRF_TOKEN=$(grep -o 'name="_token" value="[^"]*"' login_page.html | awk -F '"' '{print $4}')使用
_token执行登录请求
带上之前保存的Cookie,将_token、用户名密码等参数POST到登录接口,同时更新Cookie会话状态:curl -b cookie.txt -c cookie.txt -X POST http://my-snipit-instance/login \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "_token=$CSRF_TOKEN" \ -d "prevent_autofill=" \ -d "password_fake=" \ -d "username=webuser" \ -d "password=1234567890"参数说明:
-b加载已有Cookie,-c保存登录后更新的会话Cookie。登录成功后创建API令牌
用更新后的Cookie发送POST请求到令牌创建接口,注意要带上解码后的XSRF-TOKEN请求头:# 从Cookie文件中提取并解码XSRF-TOKEN XSRF_TOKEN=$(grep -o 'XSRF-TOKEN\s*=\s*[^;]*' cookie.txt | awk -F '=' '{print $2}' | sed 's/%3D/=/g') # 发送创建令牌请求 curl -b cookie.txt -X POST http://my-snipit-instance/oauth/personal-access-tokens \ -H "Content-Type: application/json" \ -H "X-XSRF-TOKEN: $XSRF_TOKEN" \ -d '{"name":"AutoCreatedToken","scopes":[],"errors":[]}'
原理说明
Snipe-IT基于Laravel框架,遵循其CSRF防护逻辑:
- 访问登录页面时,后端生成CSRF令牌,一方面通过
<meta>标签或表单隐藏字段嵌入HTML(即登录请求需要的_token),另一方面通过XSRF-TOKENCookie返回。 - 登录请求必须携带
_token验证合法性,成功后snipeit_session会更新为有效会话标识。 - 后续创建API令牌的POST请求,需同时携带有效的
snipeit_sessionCookie和XSRF-TOKEN(可通过Cookie或X-XSRF-TOKEN请求头传递)。
内容的提问来源于stack exchange,提问作者MaKaNu
相关产品推荐
相关产品推荐

