如何在Vue.js中检查登录状态

时间:2020-08-02 00:04:49

标签: javascript python vue.js authentication flask

我有一个python flask应用程序作为后端API,而Vue.js SPA是前端。

当我单击前端中的登录按钮时,它将 POST 到我的烧瓶登录API。 我还在响应cookie上附加了JWT令牌。

from flask import Flask,request,jsonify,make_response
from flask_cors import CORS
from flask_jwt_extended import (
    JWTManager, jwt_required, create_access_token,
    get_jwt_claims,get_jwt_identity,set_access_cookies
)

@app.route('/login',methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')

    if not(username=='toby5500' and password=='123456'):
        return jsonify({"msg":"404 error"})
    else:
        res = jsonify({"auth":"ok!"})
        #create JWT token 
        access_token = create_access_token(identity=username)
        #attach on response cookie 
        set_access_cookies(res,access_token) # has httponly flag!
        return res

登录后的浏览器cookie:

enter image description here

所以我的问题是,当我想转到其他页面时,应如何检查该用户是否已经登录。

现在我的想法是调用后端api,以在路由之前检查此浏览器是否具有正确的JWT令牌。

如果flask api返回错误消息(不具有JWT令牌),请重定向到登录页面。

像这样

router.beforeEach(async(to,from,next)=>{
    //this api will check jwt token 
    axios.get('/check_jwt').then((res)=>{
        if(res.data.error){
            next({path:'/login'})
        }
        else{
            next()//auth ok
        }
    })
})

检查登录是否正确?

2 个答案:

答案 0 :(得分:1)

您无需在每次发出请求时都重新检查令牌,只需检查令牌的到期日期并妥善处理401错误和令牌刷新逻辑即可。例如,在从Cookie或vuex中提取令牌之后,在每个钩子之前插入

  let isExpired = true
  if (token) {
    isExpired = Date.now() > jwtDecode<{ exp: number }>(token).exp * 1000
  }
  // If no token or expired
  if (!token || isExpired) {
    // ..
  }

答案 1 :(得分:0)

此处的另一个选项是反应式的。而不是在发出请求之前检查令牌是否有效,只是使您的请求像正常情况一样。如果您收到一条错误消息,表明JWT已过期(或由于其他原因而无效,例如后端上的私钥更改),那么请让您的前端然后重定向回到登录页面。

相关问题