jwt expired
在我的axios响应拦截器中,我验证我得到了那个错误。但是,如果出现此错误,我想自动向服务器请求获取新的访问令牌。
这可以在axios中完成吗?
axios拦截器
service.interceptors.response.use(
response => {
if (response.data.error === 'TokenExpiredError') {
}
return response.data
},
error => {
console.log('error', error)
return Promise.reject({ ...error })
},
)
鸟巢.js授权守卫
@Injectable()
export class AuthGuard implements CanActivate {
async canActivate(context: ExecutionContext): Promise<boolean> {
const request = context.switchToHttp().getRequest()
console.log('request.body', request.body)
if (request) {
if (!request.headers.cookie) {
return false
}
const { uid } = request.body
request.user = await this.validateToken(request.headers.cookie, uid)
return true
} else {
return true
}
}
async validateToken(cookies: string, uid: string) {
const { accessToken } = this.rebuildAcessToken(cookies)
try {
const decoded: any = await jwt.verify(accessToken, process.env.SECRETKEY)
return decoded
} catch (err) {
console.log('err', err)
const message = {
error: err.name,
uid,
}
throw new HttpException(message, HttpStatus.UNAUTHORIZED)
}
}
private rebuildAcessToken(cookies: string) {
let refreshToken
let accessTokenHeaderPayload
let accessTokenSignature
// separate cookies
cookies.split(' ').forEach(cookie => {
if (cookie.includes('refresh')) refreshToken = cookie
if (cookie.includes('access_token_header_payload'))
accessTokenHeaderPayload = cookie
if (cookie.includes('access_token_signature'))
accessTokenSignature = cookie
})
// separate cookie value from key
refreshToken = refreshToken.split('=')[1]
accessTokenHeaderPayload = accessTokenHeaderPayload.split('=')[1]
accessTokenSignature = accessTokenSignature.split('=')[1]
// remove semicolor appended in the cookie
if (refreshToken.charAt(refreshToken.length - 1) === ';')
refreshToken = refreshToken.substring(0, refreshToken.length - 1)
if (
accessTokenHeaderPayload.charAt(accessTokenHeaderPayload.length - 1) ===
';'
)
accessTokenHeaderPayload = accessTokenHeaderPayload.substring(
0,
accessTokenHeaderPayload.length - 1,
)
if (accessTokenSignature.charAt(accessTokenSignature.length - 1) === ';')
accessTokenSignature = accessTokenSignature.substring(
0,
accessTokenSignature.length - 1,
)
// combine accessToken
const accessToken = `${accessTokenHeaderPayload}.${accessTokenSignature}`
return {
refreshToken,
accessToken,
}
}
}