Я работаю над приложением 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)
})
}