Серверная сторона: как обновить просроченные токены? - PullRequest
2 голосов
/ 12 июня 2019

Я работаю над приложением nuxt.js, предоставляющим бэкэнд для ampify, более конкретно: Cognito для управления пользователями / удостоверениями и AppSync для API.

AppSync использует IAM в качестве авторизации на стороне клиента и API-ключ на стороне сервера.

Когда первоначальный запрос сделан на сервер, я могу проанализировать токены, включенные в cookie, и проверить, действительны ли они.

Если токен действителен, все отлично: я могу получить пользователя из своей базы данных и обновить свое хранилище Vuex, прежде чем начальная страница будет отправлена ​​обратно клиенту.

Однако, если срок действия токена истек, у меня возникла проблема, поскольку клиент / браузер затем получает начальную страницу, на которой ни один пользователь не вошел в систему. На стороне клиента, когда инициализируется веб-приложение, запускается библиотека амплификации " msgstr ", видит просроченные токены и автоматически обновляет их в фоновом режиме. Когда я нажимаю «Обновить», новые токены отправляются на сервер, и на этот раз они действительны. Не большой опыт.

Следовательно, мой вопрос заключается в том, как обновить токен на стороне сервера в первый раз, когда истек срок действия проанализированного токена?

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)
    })
}
...