使用角度4中的http get方法丢失JWT令牌

时间:2018-03-20 09:37:52

标签: angular jwt httpclient angular4-httpclient

我正在使用Angular 4的HTTPClient模块从数据库中检索数据。 相应的服务有以下方法,

getPosts() {
        const httpHeaders = new HttpHeaders().set('Content-Type', 'application/json');
        // tslint:disable-next-line:max-line-length
        httpHeaders.set('Authorization for JWT', 'Token');
        return this.http.get('http://localhost:9090/api/user' + '?user_id=' + this.user.id.toString(),
    {headers: httpHeaders,
    responseType: 'json'});
    }

我从一个组件调用此方法,如下所示,

this.Servie.getPosts().subscribe(pos => {
     console.log(pos);
   });

但是我在服务器端收到如下错误,

  

java.lang.RuntimeException:缺少JWT令牌

客户端错误,

  

无法加载http://localhost:9090/api/user?user_id=1:响应   预检具有无效的HTTP状态代码500。

请纠正我哪里出错了?

我根据下面的讨论进行了更改,但问题仍然如下, 我想我现在搞砸了,我做了如下以下修改,这是在服务中编写的代码,

const httpHeaders = new HttpHeaders()
    .set('Content-Type', 'application/json')
    // tslint:disable-next-line:max-line-length
    .set('RequestAuthorization', 'Bearer ' + 'eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiI5ODg0NjUxMjMzIiwidXNlcklkIjoiNSJ9.gwiZcx5I8rInXJGANvS9twupXjdjrzFdZNZ0K85u-KA8LXXDgDf27mUzUoiEyxRMg');
    return this.http.get('http://localhost:9090/user' + '?user_id=' + this.user.id.toString(),
{headers: httpHeaders});

我打电话给上述服务如下,

    this.userServie.getPosts().map((res: Response) =>
   console.log(res.text()));

但服务没有达成,我没有在浏览器开发工具的网络选项卡中看到GET方法。哪里错了?请纠正我。

2 个答案:

答案 0 :(得分:1)

标题已定义了值。

httpHeaders.set('Authorization for JWT', 'Token');

应该是

httpHeaders.set('Authorization', 'Bearer ' + token);

如果您向服务器提供随机令牌,当然它会告诉您该令牌丢失。在您的情况下,您发送此

Authorization for JWT --> Token

答案 1 :(得分:0)

一旦你弄清楚要发送的真实标题,我认为你会遇到两个问题:

问题#1

HttpHeaders类是不可变的

所以你需要这样的东西

const httpHeaders = new HttpHeaders()
.set('Content-Type', 'application/json')
.set('Authorization', 'Bearer [yourTokenHere]')

而不是声明httpHeaders并在不链接呼叫的情况下调用set

const httpHeaders = new HttpHeaders();
//The line below has no effect on the httpHeaders instance
httpHeaders.set('Authorization', 'Bearer [yourTokenHere]');

问题#2

另外,您确定在Java服务器上正确配置了CORS吗?

您收到有关preflight请求丢失令牌的错误(即使用Options方法的请求)。 AFAIK,浏览器不会为预检请求发送Authorization等自定义标头。因此,服务器不应该检查令牌的OPTIONS请求(否则,你将总是得到401因为将不会发送令牌)