用Postman调用api/auth/jwt/login 接口得到: { "timestamp": "2022-02-15T01:36:27.297+00:00", "status": 403, "error": "Forbidden", "message": "CSRF Token Invalid", "path": "/api/auth/jwt/login" }
发现login接口也被CsrfInterceptor拦截 那么使用使用login接口csrfToken怎么得到呢
现在通过浏览器访问和源码阅读 发现后端会生成一个XSRF-TOKEN的cookie,里面记录的就是csrf-token 莫非前端调用登录接口时先从cookie中先取出这个token? 直接调用login接口 发现403 然后就从cookie中取出名为XSRF-TOKEN的值 再调用login接口
需要加头信息'Authorization':'',否则需要提供csrfToken。
系统支持jwt认证和传统的session认证。header中有Authorization信息,就走jwt认证;如果没有就走传统的session认证,如果是post请求,则需要提供csrfToken
用postman可以参考系统中浏览器的调用方式,模仿浏览器里发送的header和body,总能得到相同的结果。
直接用浏览器访问后台,进行登录,查看浏览器的网络请求,就可以看到浏览器的调用方式及其发送的header和body。
1浏览器的调用方式可以 给个链接么 2没有登录 就拿不到 Authorization 使用登录接口时 Authorization 这个应该 传的是 Bearer *** 那么这个***又从哪获得呢 3 使用csrfToken 应该在调用login接口之前 有地方获取csrfToken ,这个token前端是从哪拿的
jwt方式登录时没有bearer,所以传空值就可以,'Authorization':''。header中有Authorization信息的作用值告诉服务器,这是jwt请求,不需要验证csrfToken
jwt:如果传入Authorization:“abcd”也是可以行的,传入Authorization:‘’也可以,不应该是配置拦截器不拦截登录路由么,现在这个Authorization:‘’感觉有点点奇怪
因为系统需要同时支持jwt认证和传统的session认证,那么就需要一个标识区分这两种不同的请求,这个标识就是header中的Authorization。
header中的Authorization有两个作用,一个是标识该请求是jwt认证的请求(即不需要验证csrfToken),第二个是标识用户的身份,如果Authorization给的是一个无效值(包括空值、‘abcd'或其它任何无效字符),其结果就是系统无法获取到用户的身份信息,会认定该请求是未登录的。
由于登录请求本身就不需要有已登录的状态,所以Authorization传任何值效果都一样、都可以,其作用只是让系统知道是jwt请求,不要验证scrfToken信息。
谢谢解答
如果要使用csrfToken方式呢 那么这个csrfToken怎么获取呢