我正在使用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)
})
}