2

我正在开发一个 nuxt.js 应用程序,它通过放大提供后端,更具体地说:用于用户/身份管理的 Cognito 和用于 API 的 AppSync。

AppSync 在客户端使用 IAM 作为授权,在服务器端使用 API KEY。

当向服务器发出初始请求时,我可以解析 cookie 中包含的令牌并检查它们是否有效。

如果令牌是有效的,那么一切都很好:我可以在初始页面发送回客户端之前从我的数据库中获取用户并更新我的 Vuex 存储。

但是,如果令牌已过期,我会遇到问题,因为客户端/浏览器随后会收到一个没有用户登录的初始页面。在客户端,当 Web 应用程序初始化时,放大库“启动”,看到过期的令牌并继续在后台自动刷新它们。当我点击刷新时,新令牌被发送到服务器,这一次是有效的。不是很棒的经历。

因此,我的问题是,当解析的令牌过期时,如何在服务器端第一次刷新令牌?

nuxtServerInit(store, context) {
  const cookie = context.req.headers.cookie
  if (!cookie) { return console.log("no cookie received") }

  const parsedCookie = cookieParser.parse(cookie)

  var idToken = ""
  var refreshToken = ""
  var userData: Object | null = null

  Object.keys(parsedCookie).forEach((key, index) => {
    if (key.includes("idToken")) idToken = parsedCookie[key]
    if (key.includes("refreshToken")) refreshToken = parsedCookie[key]
    if (key.includes("userData")) userData = JSON.parse(parsedCookie[key])
  }

  return context.$axios
    // validate token against cognito
    .get("https://cognito-idp.us-east-1.amazonaws.com/us-east-xxx/.well-known/jwks.json")
    .then(res => jwt.verify(idToken, jwkToPem(res.data.keys[0]), { algorithms: ["RS256"] }))
    .then(decodedToken => {
      // token is valid, proceed to grab user data
      var user = { attributes: {} }
      ;(userData!["UserAttributes"] as Array<any>).forEach(element => {
        user.attributes[element.Name] = element.Value
      })
      const sub = user.attributes["sub"]
      return sub
    })
    .then(sub => {
      // fetch user data from API
    })
    .then(res => {
      // update store with user data 
    })
    .catch(e => { 
      // TODO: CASE WHERE TOKEN IS INVALID OR EXPIRED
      // THIS IS WHERE I WOULD NEED TO REFRESH THE TOKEN
      console.log("[nuxtServerInit] error", e.message)
    })
}
4

0 回答 0