Flask用户身份认证

如果是跨域请求,而且在请求头中添加了东西(token),那么每次请求服务器时都会有一个 options 请求(预检请求),这会影响服务器响应的速度。

我们可以通过在响应头中添加 Access-Control-Max-Age 来解决,它的作用是把 OPTIONS 响应缓存起来,在指定的时间内,不会再次发起 OPTIONS 预请求,这样只有在第一次请求的时候会有 OPTIONS ,之后浏览器会从缓存里读取响应,也就不会再发送OPTIONS请求了。

1
2
3
4
@app.after_request
def addHeaders(response):
response.headers['Access-Control-Max-Age'] = '2592000'
return response

跨域用户身份认证方案

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,我们可以进行设置:

  1. 后端采用 CORS 策略,将 supports_credentials 设为 True

  2. 前端配置 axios 时加上 withCredentials: true

    1
    2
    3
    4
    5
    const axios_ = axios.create({
    baseURL: 'http://localhost:5000',
    timeout: 60 * 1000,
    withCredentials: true
    });

现在,前后端通信时就会自动携带 cookie 了。

token

token 由后端生成,发送给前端,然后前端进行保存,并在每次请求时将其加入到请求头中,后端接收到请求后通过比对 token 值判断用户身份。

token 一般存放的是用户的 id 或 用户名,并加密保存到 redis 或 mysql 中。

对于 jwt,token 不需要后端进行保存,验证即可。