代码之家  ›  专栏  ›  技术社区  ›  Billybobbonnet

我应该如何处理nuxt cookies过期和工作流?

  •  0
  • Billybobbonnet  · 技术社区  · 6 年前

    我使用Nuxt前端(通用模式)和Apollo端点作为后端,为一个项目创建了一个身份验证工作流。

    这是我发现的几个例子的混合,而且,对于SSR,由于我没有完全预见到可能出现的错误,我想确保我如何继续没有危险信号。

    在后端,我使用express中间件对JWT auth令牌进行签名、检查,并在授权头中返回它们。以下是中间件:

    import jwt from 'jsonwebtoken';
    import { AuthenticationError } from 'apollo-server-express';
    
    export const getToken = payload => {
        return jwt.sign(payload, process.env.SEED, { expiresIn: process.env.EXPTOKEN });
    }
    export const checkToken = (req, res, next) => {
        const rawToken = req.headers["authorization"]
        if (rawToken) {
            try {
                const token = rawToken.substring(7)
                // Verify that the token is validated
                const { user, role } = jwt.verify(token, process.env.SEED);
    
                const newToken = getToken({ user, role });
    
                req.user = user;
                req.role = role;
                res.header("Access-Control-Allow-Origin", "*");
                res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
                res.set("Access-Control-Expose-Headers", "authorization");
                res.set("authorization", newToken);
    
            } catch (error) {
                if (error.name === "TokenExpiredError") {
                    res.set("Access-Control-Expose-Headers", "authorization");
                    res.set("authorization", false);
                }
                console.log("invalid token", error);
                return new AuthenticationError
                // Invalid Token
            }
        }
    
        next();
    }
    

    因为有一个 Nuxt-Apollo module ,我使用了它的方法 onLogin, onLogout and getToken 将JWT字符串存储在cookie中。据我所知,SSR应用没有与客户端匹配的服务器端本地存储,因此它们必须使用cookie。对的

    这是我的nuxt中间件,在允许用户访问身份验证路由之前,我会检查用户的凭据。这是相当混乱,但它完成了工作,除了评论的部分。

    export default function ({ app, route, error, redirect }) {
      const hasToken = !!app.$apolloHelpers.getToken()
    
      // this part does not work
      /*   const tokenExpireDateTime = app.$cookies.nodeCookie.parse('cookie-name', 'expires')
        if (hasToken && tokenExpireDateTime < 0) {
          error({ statusCode: 403, message: 'Permission denied', description: 'Sorry, you are forbidden from accessing this page.' })
          app.$apolloHelpers.onLogout()
          return redirect('/login')
        }
       */
      if (!hasToken) {
        if (route.name === 'welcome-key') {
          // enrollment link route
        } else {
          if (route.name === 'home') {
            error({ errorCode: 403, message: 'You are not allowed to see this' })
    
            return redirect('/showcase')
          }
          if (!['login', 'forgot_password', 'reset_password-key'].includes(route.name)) {
            error({ errorCode: 403, message: 'You are not allowed to see this' })
    
            return redirect('/login')
          }
        }
      } else {
        if (['login', 'forgot_password', 'reset_password-key'].includes(route.name)) {
    
          redirect('/')
        }
      }
    }
    

    我有一个问题和几个困惑点。

    我的问题是我拿不到饼干 expires 如果由于JWT已过期而需要再次登录,则在上述nuxt middlware中重定向。我使用了上面提到的代码 in this issue 作为参考。

    对于这个问题,我的困惑在于:

    • 我希望cookie上的过期日期是由Nuxt Apollo模块设置的,我必须使其与服务器上设置的持续时间相匹配(即。 process.env.EXPTOKEN 在上面提到的服务器中间件中),正确吗?

    • 单是过期时间就很容易解决,真正的安全性在于,当我的服务器中间件处理请求时,头中缺少有效的令牌。它用于客户端检测和重定向过期的令牌/cookie,以及在SSR期间服务器端预取用户相关数据。正当

    • 我的前端没有考虑到我的express后端中间件发出的新令牌:它没有更新存储在JWT和JWT中的cookie 到期 重视客户端。我的意思是,我可以在响应中看到自动化头JWT字符串正在更新,但cookie没有更新。下面的请求仍然使用第一个JWT字符串。我每次往返都要更新吗?express中间件的方法让我错过了什么(你可以猜到,我没有写)

    请帮助我更好地理解这个工作流程,以及如何改进它。它试图尽可能避免把这个问题说得太宽泛,但如果我能把范围缩小得更窄,请随意建议编辑。

    0 回复  |  直到 6 年前
    推荐文章