服务器端:如何刷新过期的令牌?

时间:2019-06-12 13:10:12

标签: amazon-cognito aws-amplify amplifyjs

我正在使用nmplt.js应用程序,通过amplify提供后端,更具体地说:用于用户/身份管理的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)
    })
}

0 个答案:

没有答案