Angular HttpClient.get方法的问题

时间:2019-01-08 00:01:38

标签: angular jwt angular-httpclient passport-jwt

我正在MEAN Stack宠物项目中实施passport-jwt来进行路线保护。 服务器端运行良好,服务器在标头中接收到正确的jwt并正确响应邮递员的请求和来自我的有角度应用程序的请求,而我在get request中使用完整的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})
}

但是当我从请求网址中删除本地主机域以准备托管应用程序时,我开始收到

  

错误401未经授权

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

我登录了控制台,以请求中的标头,并注意到它们完全不同

headers of first (full url) requestheaders of second request

在第一个请求(正常工作)中,我的jwt位于[[Entries]]数组中,但是在第二个请求中,它位于lazyUpdate数组中,服务器找不到它。 为什么标头仅通过从url中删除localhost进行如此大的更改?如何修复此标头?

P.S。 my passport configuration

1 个答案:

答案 0 :(得分:0)

问题似乎出在您的password.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);
            }
        });
    }));