技术解析

用 jwt 写单点登录时,子系统已经通过 ajax 拿到了 token,这时需要将 django 的每次请求的请求头中加入 Authorization 这个关键字,是不是我的理解或者思路有问题?
0
2021-08-20 07:31:12
idczone
body['username']=$('#username').val();
body['password']=$('#password').val();
$.ajax({
				url:'http://127.0.0.1:8090/api/api-token-auth/',
				type:'post',
				data:body,
                },
				success:function (response) {
				    localStorage.token = response.token
				},
				error:function (response) {
					console.log(response);
				}
			})

这里的 response.token 就是请求头中 Authorization 对应的值,好像不太好放到 django 的每次请求头中去?


思路没错呀。获得 token 之后在全局的每个 http 请求头都加入 Auth。

django 不是后端吗?请求头加 Authorization 是前端做的事情

你可以自己包装一个$.ajax,自动从 localStorage 之类的地方获取 token 并自动加进去,然后所有请求改成用这个包装好的$.ajax
或者可以用例如 axios 的请求库的 interceptor 特性

可以全局请求添加一个拦截器,然后请求头加一个 auth

楼主全干工程师?
既然楼主都用了 jq,把需要 token 的接口修改成这段这样子就行了
```javascript
$.ajax({
url:'xxx',
headers:{
Authorization:localStorage.token
},
......(剩下的属性)
})
```

jwt 可以单点登录吗?

真是前后端不分
请求头是 js 加啊

现在的问提就是不知道该怎么全局加 http 请求头,因为 ajax 只有登录的时候用到,其他都是直接跳转

你的意思是问类似通过标签跳转吗,这种的话应该可以在标签的 href 值中加后端返回的 token 吧

@Jrue0011。。。想错了,以为是 CSRF 的 token,只是单点登录的话 jwt 的 token 放 cookie 就行了吧

是啊如果是同域名下的话确实可以这么做,现在既不是同域名也不是前后端分离

5 楼的思路是可行的, 我也是这么做的, 目前没什么问题

前后端分离的话确实可以这么做,可现在项目是前后端不分离的。

$.ajaxSetup 设置所有 ajax 请求公用参数
token 存放 sessionStorage,localStorage 还是 cookie 就看你的需要和服务端设计了。

interceptor 好一些

全干工程师建议你花几天时间学下 Vue,我之前 token 是按照 5 楼写法保存的全局请求头,但是保存在了 sessionStorage 里。但是前端登录判断拦截写起来就太费劲了,总不能每次请求都加一个后端 Token 失效验证吧,ajax 能活活把人写死。

JWT 适合单页面应用,前端自己管页面路由,有前端路由就会有路由拦截器,在拦截器里做权限和登录判断不会很麻烦的。Ajax 用 axios 也是有 HTTP 拦截器的,像 Angular 更是直接支持 HttpInterceptor,在拦截器里做 token refresh 都可以,实际发请求的逻辑层甚至都不会发觉 token 被 refresh 了( rxjs 大法好)。
如果是传统的后端吐 HTML 的架构,还是用 Cookie 比较方便,后端控制页面重定向什么的,前端不用关心请求头和页面权限。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服