【问题标题】:Can't GET data protected by JWT despite a correctly issued token尽管颁发了正确的令牌,但无法获取受 JWT 保护的数据
【发布时间】:2018-06-24 15:07:37
【问题描述】:

我有以下返回对象的工作方法。

getWorkers(): any {
  const url = ...
  return new Observable<any>(emitter => {
    this.http.get(url).subscribe(
      result => {
        result.json().map(...).forEach(...);
        emitter.complete();
      },
      error => error);
  });
}

现在,我通过 JWT 保护端点对后端进行了更改。当然,原来的方法现在失败了,我添加了从 REST API 获取令牌。它以正确的哈希值返回。问题是我不确定如何将其插入原始响应中。

getWorkers(): any {
  const url = ...

  this.http.post(environment.sec, { credential: "1234" })
    .subscribe(secRes => console.warn(secRes.json()));

  return new Observable<any>(emitter => {
    let authorization = null;

    this.http.post(environment.secUrl, { credential: "1234" })
      .subscribe(
        secRes => {
          authorization = secRes.json();

          this.http.get(url, authorization).subscribe(
            result => {
              result.json().map(...).forEach(...);
              emitter.complete();
            },
            error => error);
        });
  });
}

我尝试发送第一次调用的结果的一些组合,例如完整的 authorization 对象以及它的 authorization.token 字段。没有什么会产生不同的结果 - 它会在未经授权的情况下返回。事实上,我注意到程序甚至没有执行结果部分的语句!

我做错了什么?

注意。我想了解它的机制,所以我想在不使用任何第三方包(包括通常推荐的angular2-jwt)的情况下解决它。

【问题讨论】:

    标签: javascript angular authorization jwt


    【解决方案1】:

    授权令牌需要在 headers 中传递

    const headers = new HttpHeaders().set('Authorization', 'Bearer ' + Cookie.get('token'));
    return this.httpClient.get(environment.api_url + 'orders', {
      headers: headers}
    );
    

    【讨论】:

    • 我找到了 HttpHeaders class,令我大吃一惊的是,出于某种原因,它在 @angular/common/http 中(我希望它在 @angular/http 或至少 @angular/common)。但是,我在 Angular API 的文档中找不到 Cookie 类。你用的是哪个版本?
    • 另外,似乎 get(...) 需要 RequestOptionArgs 类型的东西,这与 HttpHeaders不兼容>。我太不确定了,无法提出改变建议——你怎么看?
    • @DonkeyBanana 忽略代码的细节,它们是为了说明 HttpHeaders 的使用。上面的代码使用 HttpClient 而不是 Http,因为 Http 在 v5 中已被弃用。您可以使用 HttpClient,只需将构造函数中的 Http 模块替换为 HttpClient,但请记住,您可能需要编辑一些在该组件中使用 Http 的代码。
    • 我发现我在最新的 HTTP 通信类上有点过时了。现在我已经阅读了它们,我开始工作前半部分,我可以在我的通话中看到以下标题:Authorization:bla.bli.blu(我跳过了 Bearer Cookie.get 部分为简单起见)。但是,服务器仍然给我 401,但可能是后端配置的问题?
    猜你喜欢
    • 2018-10-25
    • 2020-05-29
    • 2019-12-15
    • 2020-04-14
    • 1970-01-01
    • 2020-07-17
    • 2019-11-03
    • 2020-08-21
    • 2019-02-23
    相关资源
    最近更新 更多