Не удается отправить заголовок авторизации на сервер Node 11 / Express 4 с помощью Angular 7 - PullRequest
0 голосов
/ 22 апреля 2019

Я не могу отправить заголовок Authorization через GET запрос с моего углового фронта на задний узел, которые находятся на том же VPS.

Чтобы сделатьзапрос от angular Я использую

return this.httpClient.get<ApiResponse>(ApiClientService.apiAddress + ApiClientService.secureRoute + '/posts');

И использую этот http-перехватчик из JwtModule, который устанавливает заголовок авторизации, в app.module.ts

  imports: [
    ...,
    JwtModule.forRoot({
      config: {
        tokenGetter,
        whitelistedDomains: [ApiClientService.apiAddress, 'vps.ip.address:VPS_FRONT_PORT', 'localhost:BACK_PORT', 'localhost:FRONT_PORT'], //todo clean
      }
    }),

Когда япосмотри запрос в инспекторе хрома спереди я вижу

GET /secure/posts HTTP/1.1
Host: vps.ip.address:VPS_BACK_PORT
Connection: keep-alive
Accept: application/json, text/plain, */*
Origin: vps.ip.address:VPS_FRONT_PORT
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.86 Chrome/73.0.3683.86 Safari/537.36
Referer: vps.ip.address:VPS_FRONT_PORT/posts
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,fr;q=0.8

Мы замечаем, что заголовок авторизации отсутствует .


Проблема делаетне от перехватчика IMO, а от

  • При выполнении того же запроса , но на google.com я вижу заголовок авторизации в инспекторе хрома
  • При добавлении заголовков вручную , без перехватчика, у меня та же проблема

, которая заставляет меня думать, что проблема возникает из CORS / preflight запрос конфигурации моего узла сервера. api.config.js

app.use(function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*, localhost, localhost:FRONT_PORT, vps.ip.address:VPS_FRONT_PORT'); //todo change *
    res.header('Access-Control-Allow-Methods', 'PUT, GET, POST, DELETE, OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept, Authorization');
    res.header('Access-Control-Allow-Credentials', true);
    next();
})

...

const secureApi = express.Router();
app.use('/secure', secureApi);
secureApi.use(checkToken);
ProblemRoute.init(secureApi);
PostRoute.init(secureApi);
app.use(function (err, req, res, next) {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});
const ApiConfig = {
    app: app
};

module.exports = ApiConfig;

I read Заголовок авторизации на сервере узла. secureRoute.js

const jwt = require('jsonwebtoken');

module.exports = function checkToken(req, res, next) {
    const authHeader = req.headers['authorization'];
    console.log(req.headers);
    if (authHeader.startsWith("Bearer ")) {
        const token = authHeader.substring(7, authHeader.length);

        if (token) {
            jwt.verify(token, 'my_secret_key', (err, decode) => {
                if (err) {
                    res.status(400).json({
                        "message": "Invalid token",
                    });
                } else {
                    next();
                }
            })
        } else {
            res.status(400).json({
                "message": "Token must be provided in header for endpoint access",
            });
        }
    } else {
        res.status(400).json({
            "message": "Token must be provided in header for endpoint access",
        });
    }
};

Что, конечно, вызывает ошибку , поскольку заголовок авторизации отсутствует из углового фронтального запроса.

TypeError: Невозможно прочитать свойство'arsWith 'из неопределенного в checkToken (/home/me/project/node-project/config/secureRoute.js:6:20 )

Когда я делаю аналогичный запрос с почтальоном , он работает правильно , это журнал консоли разработчика почтальона

GET / snap / postman / 81 / usr /share / Postman / resources / app / html / vps.ip.address: BACK_PORT / secure / posts Тип контента: application / json cache-control: no-cache Почтовый токен: 10a5caf7-711e-4c39-9437-58dd825ca05f Авторизация:Знаменосец eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJtYWlsIjoicGF1bEBiZWxsb2Mub3ZoIiwiaWF0IjoxNTU1ODgzMjgxLCJleHAiOjE1NTU5Njk2ODF9.s6z5hBLJWEdlDgzw9E9ePiLWj9hqmd39RF68FNRlgLk User-Agent: PostmanRuntime / 7.6.0 Accept: / хост: vps.ip.address: BACK_PORT Accept-Encoding: GZIP, выкачать

И сервер узла считывает запрос / заголовки и отвечает 200 и контент, как и ожидалось.

1 Ответ

0 голосов
/ 22 апреля 2019

Наконец, ошибка, я думаю, исходит от перехватчика, который я неправильно настроил.Я включил часть 'http://' в домен из белого списка, что заставляет его работать некорректно.

Я также начал использовать пакет cors npm, но не думаю, что это было исправлением.

...