Angular 在构建后将 'bearer' 字符串添加到身份验证 header

Angular adds 'bearer' string to authentication header after build

在我的 back-end (Nodejs + Express) 上,我使用 JWT 令牌保护路由。在开发环境中,请求中的 HTTP 授权 header 如下所示:

Authorization: JWT token_string

在我构建 angular 应用程序后,由于某种原因构建的应用程序在 header 中添加了 '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)
            }
        })
    }))
}

如果我尝试使用与开发中相同的授权 header 格式进行请求,一切正常。所以问题出在 Angular 的构建版本中,它在 Authorization header 中添加了 'Bearer '。有谁知道为什么会这样,我该如何解决?

我知道这已经是半年之后了,但仍然,只是想 post 我的问题的答案。 这种情况下的问题是,在开发中,HttpClient 没有在 'Authorization' header 的开头附加 'Bearer' 字符串,但在生产中它被包含在内。 发展:JWT token_string 生产:Bearer JWT token_string 该解决方案非常烦人,因为我必须在构建脚本中手动找到 Authorization Header 所在的部分,并删除设置 header 的字符串中的 'JWT' ,因为它看起来像Bearer 必须在其中。

之前: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)。 IDK.

距离上次回答已经过了很长时间,但它可能对某些人有帮助 - 并防止一些痛苦,就像我想出一个 'solution'。

简而言之,要求是:

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) 中,授权生成的令牌 Header 的形式为: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)fromAuthHeader AsBearerToken() 并继续相应的更改。

所以,我所做的,到目前为止在生产和开发模式下都很好地工作是尝试获得一个 'clean' 令牌 - 以 JWT eyfhik4u5h4tb[=38 的形式=] ...在任何一个环境中,包括开发和生产。

我的方法是修改 //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 前缀 - 或者任何前缀(如果存在)。

当然,使用这种方法应该记住的一点是,在部署应用程序时,应该包括特定的、已更改的 passport-jwt 模块,因为在 npm-install 上,模块将 reinitiate/update 等等,将不起作用。