0

我正在我的 MEAN Stack 宠物项目中实施 passport-jwt 来保护路由。服务器端运行良好,服务器在标头中接收到正确的 jwt 并正确响应邮递员请求和来自我的 Angular 应用程序的请求,而我在获取请求中使用完整的 url。

import { HttpClient, HttpHeaders } from '@angular/common/http';
...
constructor(private http: HttpClient) {}
...
getProfile() {
  this.loadToken();
  let requestHeaders = new HttpHeaders()
    .set('Content-Type', 'text')
    .append('Authorization', this.authToken);
  return this.http.get('http://localhost:8080/users/profile', {headers: requestHeaders})
}

但是当我从请求 url 中删除我的 localhost 域以准备应用程序进行托管时,我开始收到

错误 401 未经授权

return this.http.get('users/profile', {headers: requestHeaders})

我登录以控制台来自两个请求的标头并注意到它们完全不同

第一个(完整网址)请求的标头, 第二个请求的标头

在第一个请求(正常工作)中,我的 jwt 在[[Entries]]数组中,但在第二个请求中,它在lazyUpdate 数组中,服务器找不到它。为什么只有通过从 url 中删除 localhost 才能使标题发生如此巨大的变化?如何修复此标头?

PS我的护照配置

4

1 回答 1

0

似乎问题来自您的 passport.js

你用过

ExtractJwt.fromAuthHeaderWithScheme('JWT') // this method no longer supports by the newer versions of the passport js 

所以对于你的护照js实现试试这个。还要注意在这里给你的实现检查 jwt_payload._id对象,因为在护照 js 官方文档中,他们的实现不能给你会话数据的 id。

User.getUserById(jwt_payload._id, (err, user) => {} // 在这段代码中检查上面提到的那个

至于第二步试试这个,

var opts = {};
    opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
    opts.secretOrKey = config.secret;
    // opts.issuer = config.issuer;
    // opts.audience = config.audience;
    passport.use(new JwtStrategy(opts,function(jwtPayload,done){   
        User.getUserById(jwtPayload.id,function(err,profile){
            if(err){
                return done(err,false);
            }
            if(profile){
                return done(null,profile);
            }else{
                return done(null,false);
            }
        });
    }));
于 2019-01-09T05:24:16.990 回答