代码之家  ›  专栏  ›  技术社区  ›  asus

如果返回错误,Axios将自动发出请求

  •  0
  • asus  · 技术社区  · 4 年前

    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,
        }
      }
    }
    
    
    0 回复  |  直到 4 年前