Flask用户身份认证
如果是跨域请求,而且在请求头中添加了东西(token),那么每次请求服务器时都会有一个 options 请求(预检请求),这会影响服务器响应的速度。
我们可以通过在响应头中添加 Access-Control-Max-Age 来解决,它的作用是把 OPTIONS 响应缓存起来,在指定的时间内,不会再次发起 OPTIONS 预请求,这样只有在第一次请求的时候会有 OPTIONS ,之后浏览器会从缓存里读取响应,也就不会再发送OPTIONS请求了。
1 |
|
跨域用户身份认证方案
session
flask 的 session 机制是根据请求头中携带的 cookie 值创建对应的 session 对象。每有一个新的 cookie 值,就创建一个新的 session 对象,因此每个用户都对应一个 session 对象,不会混乱。
当在 flask 框架中编写前端代码时(同源),后台会携带带有 “Set-Cookie” 的响应头返回给浏览器,那么用户在请求时浏览器会自动携带带有 “Cookie” 的请求头给后台,”Set-Cookie” 和 “Cookie” 中保存的都是 session_id,后台会根据 session_id 找到对应的 session 对象。
如果是跨域的话,默认跨域请求是不携带 cookie 的,因此当前端向后端发起时,请求头中是没有 “Cookie” 的,后台会把 Cookie 值当成 None 来处理,创建一个新的 session 对象。那么每次请求都会创建一个新的 session,无法保持会话。
如果想要跨域携带 cookie,我们可以进行设置:
后端采用 CORS 策略,将
supports_credentials
设为 True前端配置 axios 时加上
withCredentials: true
1
2
3
4
5const axios_ = axios.create({
baseURL: 'http://localhost:5000',
timeout: 60 * 1000,
withCredentials: true
});
现在,前后端通信时就会自动携带 cookie 了。
token
token 由后端生成,发送给前端,然后前端进行保存,并在每次请求时将其加入到请求头中,后端接收到请求后通过比对 token 值判断用户身份。
token 一般存放的是用户的 id 或 用户名,并加密保存到 redis 或 mysql 中。
对于 jwt,token 不需要后端进行保存,验证即可。