Angular 6 - httpClient 在 httpOptions 中传递基本身份验证

Posted

技术标签:

【中文标题】Angular 6 - httpClient 在 httpOptions 中传递基本身份验证【英文标题】:Angular 6 - httpClient passing basic auth in httpOptions 【发布时间】:2018-11-14 15:14:24 【问题描述】:

我在 Angular 6 中有一项服务,我正在尝试更改记录,但它说我没有被授权。

现在我有这个:

const httpOptions = 
  headers: new HttpHeaders('Content-Type': 'application/json')
;

  update(id, title, content) 
    const updateData =  id: id, title: title, content: content ;
      return this.http.put(`http://myurl/$id`, updateData, httpOptions);
  

我的问题是:

如何将基本授权添加到我的 httpOptions 或将其直接添加到更新方法?

【问题讨论】:

【参考方案1】:

只需像这样在标题中添加您的令牌/授权 -

let httpHeaders = new HttpHeaders()
              .set('authorization', this.authorizationHeaderValue)
              .set('Content-Type', application/json); 

两者都有 set 和 append 等方法。 set 构造一个带有新值的新主体, append 构造一个带有附加值的新主体

PS:这里我假设变量 (this.authorizationHeaderValue) 值是包含值,例如 BearerBasic 或任何需要的值,请相应地更改它。

更多内容请阅读这里

https://www.concretepage.com/angular-2/angular-httpclient-get-example#parameters

【讨论】:

可能是第2行的逗号 哦,那只是一个拼写错误。无论如何,不​​值得为此投反对票,谢谢您指出:) 您的授权标头错误。 “授权”和值通常在实际令牌(不是空格)前面有“基本”或“摘要”或“承载”字样。如果这是一个 OAuth 令牌,那么您将在 authtoken 前面使用“Bearer” 我想知道这是不是你的意思。但是变量名称只是“authToken”,我认为它只是令牌本身,而不是授权标头字符串(我可能会将变量命名为“authorizationHeaderValue”或类似的名称。 你说得对,变量名可能比简单的authToken 更好,会按照你的建议更新变量名。谢谢@KevinM【参考方案2】:

您可以通过在标题中附加基本授权来添加它,如下所示:

var headers_object = new HttpHeaders();
headers_object.append('Content-Type', 'application/json');
headers_object.append("Authorization", "Basic " + btoa("username:password"));

const httpOptions = 
  headers: headers_object
;

【讨论】:

这就是我所追求的,但我如何将其添加到此: const httpOptions = headers: new HttpHeaders('Content-Type': 'application/json') ;跨度> 出现错误:' headers: Headers; 类型的参数; ' 不能分配给类型为 ' headers?: HttpHeaders | [标题:字符串]:字符串 |细绳[]; ; 您必须在 header 参数中分配 header 变量。 H 必须小写。我已经更新了解决方案以避免混淆。 new Headers(); 应该是new HttpHeaders() @PardeepJain 它在 Angular 4 中工作。我已经更新了 Angular 5/6 的答案。谢谢。【参考方案3】:

查看 angular.io 文档,非常简单。

const httpOptions = 
  headers: new HttpHeaders(
    'Content-Type':  'application/json',
    'Authorization': 'Basic my-auth-token'
  )
;

您可以像以前一样使用httpOptions 常量。

欲了解更多信息:https://angular.io/guide/http#adding-headers

PS:这是一种适用于小型或快速应用程序的方法,如果您想构建更强大的应用程序,请考虑使用自动添加授权标头的 HTTP 拦截器。

【讨论】:

嗨,朋友,我有 2 个服务,例如,用于登录的 authservice 和用于获取数据的 userService,登录后我设置 localstorage 并创建令牌,在 userService 中我试图获取令牌但没有成功 const httpOptions = headers: new HttpHeaders( 'Content-Type': 'application/json', 'Authorization': 'Bearer' + localStorage.getItem('token') ) ;它没有得到令牌,知道吗?【参考方案4】:

在 httpOptions 中传递基本身份验证的 httpClient 在 Angular 6 中是不同的

let httpHeaders= new HttpHeaders();
httpHeaders.append('Content-Type', 'application/json');
httpHeaders.append("Authorization", "Basic " + btoa("username:password"));

const httpOptions = 
  headers: httpHeaders
;

update(id, title, content) 
    const updateData =  id: id, title: title, content: content ;
      return this.http.put(`http://myurl/$id`, updateData, httpOptions);
  

【讨论】:

【参考方案5】:
import  HttpClient, HttpHeaders  from '@angular/common/http';

var headers = new HttpHeaders();

var token = localStorage.getItem('token');

headers.append('Content-Type', 'application/json');

headers.append("Authorization", "Basic " + token));

const httpOptions = 
  headers: headers
;

【讨论】:

localStorage.getItem 用于在设置为本地存储的情况下将令牌值获取到本地存储。【参考方案6】:
const httpOptions = 
  headers: new HttpHeaders(
    
      'Content-Type': 'application/json',
      'Authorization': `Basic ` + btoa('user:password'),
    
  )
;


return this.http.post<any>(
      `apilink`,,
      httpOptions
    ).pipe(map(res => 
      return res;
));

【讨论】:

欢迎来到 SO。您应该在答案中添加一些解释。【参考方案7】:

许多服务器需要额外的标头来进行保存操作。例如,服务器可能需要授权令牌或“Content-Type”标头来显式声明请求正文的 MIME 类型。在您的情况下,您可以通过以下代码进行基本授权。

import  HttpHeaders  from '@angular/common/http'; 
const httpOptions = headers: new HttpHeaders(
'Content-Type':  'application/json',
Authorization: 'my-auth-token' );

您可以在发出下一个请求之前更新授权标头

httpOptions.headers =  httpOptions.headers.set('Authorization', 'my-new-auth-token');

【讨论】:

以上是关于Angular 6 - httpClient 在 httpOptions 中传递基本身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 6 中使用 HttpClient 禁用缓存

Angular 6 HTTPClient:请求触发一次,收到2个响应

Angular 6 - 从 httpClient 获取 csv 响应

Angular 6获取带有httpclient问题的响应标头

当我在 HttpInterceptor 类中注入使用 HttpClient 的服务时,Angular 6 进入循环依赖的无限循环

Angular 6 和 Spring boot - 无法使用简单的 HttpClient 调用获取数据