JsonWebTokenError: jwt искажен: не удается проверить мой Webtoken

#node.js #angular #express #ionic-framework #jwt

#node.js #угловатый #выразить #ionic-framework #jwt

Вопрос:

Я добавил токены в свой реальный проект, но у меня проблема с их декодированием:

Я использую следующий метод для декодирования токена:

 function verifyToken(req, res, next) {
console.log(req.headers);
console.log(JSON.stringify(req.headers.authorization));
if(!req.headers.authorization) {
    return res.status(401).send('Unauthorized request!');
} 
let token = req.headers.authorization.split(' ')[1];
console.log(token);
if(token === 'null') {
    return res.status(401).send('Unauthorized request!');
}
let payload = jwt.verify(token, 'secretKey');
if(!payload){
    return res.status(401).send('Unauthorized request!');
}
req.userId = payload.subject;
next();
}
  

Метод перехвата:

   intercept(req, next) {
    let storageService = this.injector.get(StorageService);
    let token = '';
    storageService.get(AuthConstants.AUTH).then(res => {
      console.log("res: "   res   'ntype: '   typeof(res));
      
      token = res;     
    });
    
    let tokenizedReq = req.clone({
      setHeaders: {
        Authorization: `Bearer ${token}`
      }
    });
    
    return next.handle(tokenizedReq);
  }
}

  

Редактировать:

служба хранения:

 async store(storageKey: string, value: any) {

    const encryptedValue = btoa(escape(JSON.stringify(value)));

    await Storage.set({
      key: storageKey,
      value: encryptedValue
    });
  }

  async get(storageKey: string) {

    const res = await Storage.get({ key: storageKey })

    if(res.value) {
      return JSON.parse(unescape(atob(res.value)));
    } else {
      return false;
    }
  }
  

Теперь возникает следующая проблема: res имеет значение токена и присваивает его «токену». НО авторизация выполняется с помощью токена= «. Я думаю, это потому, что функция StorageService.get() является асинхронной. Как я могу сказать своему коду, чтобы он дождался назначения данных токену, прежде чем выполнять req.clone?

Ответ №1:

Попробуйте это:

server.js

 function verifyToken(req, res, next) {
  const token = req.header('Authorization');
  if (!token) return res.status(401).send('Access Denied!');
  
  try {
    const verified = jwt.verify(token, 'secretKey');
    req.user = verified;
  }
  catch(err) {
   res.status(400).send('Invalid Token!');
  }
}
  

auth.iterceptor.ts

  let token = this.authService.getToken();
 const updatedRequest = request.clone({
   headers: request.headers.append("Authorization", "Bearer "   token)
 });
  

Комментарии:

1. Возникает ошибка: throw er; // Unhandled 'error' event ^ Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client . И я тестирую метод с допустимым токеном, но он возвращает «недопустимый токен»

2. Я также добавил образец перехватчика. проверьте это

3. Я нашел проблему, я добавил ее в свой вопрос выше.