CAS服务票验证失败,服务端返回Ticket不匹配怎么办?
在React应用集成CAS单点登录时,获取到serviceTicket后调用验证接口总报错“Ticket不匹配”。代码逻辑没问题,但控制台显示400错误,试过刷新页面重试还是不行。
function handleCasCallback() {
const urlParams = new URLSearchParams(window.location.search);
const ticket = urlParams.get('ticket');
// 向后端验证ticket
fetch('/api/cas/validate', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ticket })
}).then(response => {
if (!response.ok) throw new Error('验证失败');
// 处理登录成功
});
}
后端日志显示收到的ticket参数是空值,但前端控制台打印ticket明明有值。检查了CAS服务地址配置也没问题,这个参数到底是哪里漏了?
JSON.stringify会把null或undefined转成字符串"null",后端收不到正确 ticket。改成这样:或者加个判断:
试试这个方法:把
fetch请求的body部分改成application/x-www-form-urlencoded格式,而不是application/json。CAS 默认对这种格式的支持更好。修改后的代码大概是这样的:
另外再确认下后端接收参数的地方,确保它能正确解析
ticket。如果还是不行,可以在前端打印完整的请求内容,看看是不是其他地方覆盖或者清空了参数。这问题折腾起来是挺烦人的,但一般就是格式不对或者参数名不匹配导致的。改完记得清理下浏览器缓存再试。