#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. Я нашел проблему, я добавил ее в свой вопрос выше.