Nano Hash - криптовалюты, майнинг, программирование

Angular добавляет строку bearer в заголовок аутентификации после сборки

На моем сервере (Nodejs + Express) у меня есть защищенные маршруты с помощью токена JWT. В среде разработки заголовок HTTP-авторизации в запросе выглядит так:

Authorization: JWT token_string

После того, как я создаю приложение angular, созданное приложение по какой-то причине добавляет в заголовок Bearer:

Authorization: Bearer JWT token_string

Запрос:

 addTemplate(template: ITemplate): Observable<ISuccessMsgResponse> {
    return this.http.post<ISuccessMsgResponse>(`${this.ULR}template`, template, {
      headers: new HttpHeaders({
        'Authorization': this.token.getToken()
      })
    });
  }

Узел:

.post(passport.authenticate('jwt', {session: false}), (req, res) => {
     // Code to execute
}

паспорт:

module.exports = function(passport) {
    let opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
    opts.secretOrKey = config.secret;
    passport.use(new JwtStrategy(opts, (jwtPayload, done) => {
        User.getUserById(jwtPayload._id, (err, user) => {
            if(err) {
                return done(err, false)
            }
            if(user) {
                return done(null, user)
            } else {
                return done(null, false)
            }
        })
    }))
}

Если я попытаюсь выполнить запрос с тем же форматом заголовка авторизации, что и при разработке, все будет работать нормально. Таким образом, проблема заключается во встроенной версии Angular, которая добавляет «Bearer» в заголовок авторизации. Кто-нибудь знает, почему это происходит и как я могу это исправить?

23.05.2019

Ответы:


1

Я знаю, что это произошло полгода спустя, но все же просто хочу опубликовать ответ на мою проблему. Проблема в этом случае заключалась в том, что при разработке HttpClient не добавлял строку «Bearer» в начало заголовка «Authorization», но в производстве она была включена. Разработка: JWT token_string Производство: Bearer JWT token_string Решение было довольно раздражающим, потому что мне приходилось вручную находить часть встроенного скрипта, где был заголовок авторизации, и удалять 'JWT' в строке, где устанавливается заголовок, поскольку похоже, что носитель требуется для быть в этом.

До: Bearer JWT token_string После: Bearer token_string

В бэкэнде также пришлось изменить строку для извлечения. До:

    let opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
    opts.secretOrKey = config.secret;
    passport.use(new JwtStrategy(opts, (jwtPayload, done) => {
        User.findById(jwtPayload._id, (err, user) => {
            if(err) {
                return done(err, false);
            }
            if(user) {
                return done(null, user);
            } else {
                return done(null, false);
            }
        });
    }));

После:

    let opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('bearer');
    opts.secretOrKey = config.secret;
    passport.use(new JwtStrategy(opts, (jwtPayload, done) => {
        User.findById(jwtPayload._id, (err, user) => {
            if(err) {
                return done(err, false);
            }
            if(user) {
                return done(null, user);
            } else {
                return done(null, false);
            }
        });
    }));

Я не занимаюсь экспортом в этой теме, но я действительно не вижу причин, по которым «Bearer» не будет добавлен в разработку, как в продакшн. Возможно, это просто ошибка (Angular 7). Я НЕ ЗНАЮ.

29.11.2019
  • @SaadAbbasi я попробую, давай 10.09.2020

  • 2

    Прошло довольно много времени с момента последнего ответа, но он может быть кому-то полезен - и предотвратить некоторую боль, как у меня, пока я не придумал «решение».

    Короче говоря, запрос такой:

    getUserProfile(){
    this.loadCurrentToken();
    const headers = new HttpHeaders({
      'Content-Type': 'application/json',
      Authorization: this.authToken,
    });
    console.log(headers);
    return this.http.get('/users/profile', {headers});
    }
    

    Проблема, с которой я столкнулся, заключалась в том, что в режиме разработки (ng serve) токен, созданный в заголовке авторизации, имел форму: JWT eyfhik4u5h4tb ... и т. Д., В производственном режиме (ng build --prod ) слово Bearer было добавлено в качестве префикса, поэтому теперь токен был: Bearer JWT eyfhik4u5h4tb ... и т. д. (как следует из приведенного выше ответа)

    Конечно, это стандарт, но также не хотелось переходить на метод извлечения из метода fromAuthHeaderWithScheme ('jwt'), что означает следующее:

    let opts ={};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderWithScheme('jwt');
    opts.secretOrKey = config.secret;
    passport.use(new JwtStrategy(opts, (jwt_payload, done) => {
        User.getUserById(jwt_payload._id, (err, user) => {
            if(err){
                return done(err, false);
            }
    
            if(user){
               return done(null, user); 
            } else {
                return done(null, false);
            }
        });
    }));
    

    ... к чему-то другому, скажем, fromAuthHeaderWithScheme (auth_scheme) или fromAuthHeaderAsBearerToken (), и продолжаем вносить соответствующие изменения.

    Итак, что я сделал и пока отлично работает как в режиме производства, так и в режиме разработки, я попытался получить «чистый» токен - в форме JWT eyfhik4u5h4tb ... и т. Д. В любой среде, как разработчик, так и прод.

    Мой подход заключался в изменении файла //node_modules/passport-jwt/lib/auth_headers.js как такового:

    'use strict';
    
    var re = /(\S+)\s+(\S+)/;
    
    
    
    function parseAuthHeader(hdrValue) {
        if (typeof hdrValue !== 'string') {
            return null;
        }
    
        /* ADDED THIS LINE */
        hdrValue = hdrValue.substring(hdrValue.indexOf('JWT') + 0);
        /* --------------- */
    
        var matches = hdrValue.match(re);
        // console.log(hdrValue);
        return matches && { scheme: matches[1], value: matches[2] };
    }
    
    
    
    module.exports = {
        parse: parseAuthHeader
    };
    

    Итак, теперь экстрактор будет заботиться только о той части токена, которая начинается с JWT и игнорирует префикс Bearer - или любой другой - если он присутствует.

    При таком подходе, конечно же, следует иметь в виду, что при развертывании приложения необходимо включить конкретный измененный модуль паспорт-jwt, потому что после npm-install модуль будет повторно инициировать / обновлять и т. Д. И не будет работать.

    26.02.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..