微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么“承载”一词从我的 HTTP 授权标头中删除

如何解决为什么“承载”一词从我的 HTTP 授权标头中删除

我正在使用 okta-angular 包在现有的 Angular 6 应用程序中实现 OAuth2。我遇到了一个问题,即“承载”一词从任何 HTTP 调用中的授权请求标头中删除或未到达授权请求标头。这导致 401 未授权。任何有关为什么会发生这种情况的见解以及如何纠正它的方向?

base.service.ts getHeaders() 方法负责为应用中的所有 HTTP 调用生成标头,并在身份验证令牌前包含“Bearer”一词。

protected async getHeaders(): Promise<boolean> {
  if (await this.oktaService.isAuthenticated()) {
    this.headers = new HttpHeaders({ Authorization: `Bearer ${this.oktaService.getAccesstoken()}`,'Content-Type': 'application/json','Accept': 'application/json','Cache-Control': 'no-cache'  });
    return true;
  }
  return false;
}

base.service.ts get() 方法使用 this.headers

public async get(methodRoute: string,param?: string): Promise<Observable<ResponseDTO<T>>> {
  if (await this.getHeaders()) {
    let fullUrl = `${this.entityUrl + methodRoute}`;
    if (param !== undefined && param !== null && param.length > 0) {
      fullUrl += '/' + param;
    }
    return this.http.get<ResponseDTO<T>>(fullUrl,{ headers: this.headers });
  }
  return null;
}

nav-menu.component.ts 使用 baseService 的 get() 方法

async load() {
  if (this.isAuthenticated) {
    (await this.baseService.get('url/goes/here'))
      .subscribe((response: ResponseDTO<boolean>) => {
        this.isSup.next(response.responSEObject);
      });

    (await this.baseService.get('url/goes/here'))
      .subscribe((response: ResponseDTO<boolean>) => {
        this.isKSup.next(response.responSEObject);
      })
  }
}

运行代码我可以观察到 this.headers 并看到完整的“Bearer {token here}”,明确地保留了 Bearer 一词。在 F12 Developer Tool 的控制台中,HTTP 请求返回 401 Unauthorized 错误。通过开发工具(Chrome 和 Edge)查看请求标头,我发现授权标头中缺少“承载”一词,但存在令牌。

Screenshot of Authorization header

package.json 中的相关项目

"@angular/cdk": "^6.4.7","@angular/common": "^6.1.10","@angular/compiler": "^6.1.10","@angular/core": "^6.1.10","@angular/forms": "^6.1.10","@angular/http": "^6.1.10","@okta/okta-angular": "^3.1.0","@okta/okta-auth-js": "^5.0.2","node-sass": "^4.14.1","rxjs": "^6.6.3",

我尝试降级到 6.1.7,它匹配一个不同的项目,该项目正确地将“Bearer”传递给请求标头。没有骰子。我尝试重构 load() 方法以首先获取标头并内联使用它们,类似于 get() 方法,但这也不起作用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。