如何在角度6中将JWT令牌作为授权标头发送

Sum*_*mit 7 angular2-jwt angular

目前,我在组件.ts文件中使用了此静态代码,但该代码无法正常工作。它返回未经授权的(401)。但是当我将令牌作为查询字符串传递时,它可以正常工作。请给出一个组件.ts文件的工作示例。

    import { HttpClient, HttpResponse ,HttpHeaders} from '@angular/common/http';


    var t=`eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODAwMFwvYXBpXC9sb2dpbiIsImlhdCI6MTUzNzcxNTMyNSwiZXhwIjoxNTM3NzE4OTI1LCJuYmYiOjE1Mzc3MTUzMjUsImp0aSI6IlBKWVhnSkVyblQ0WjdLTDAiLCJzdWIiOjYsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEifQ.1vz5lwPlg6orzkBJijsbBNZrnFnUedsGJUs7BUs0tmM`;

    var headers_object = new HttpHeaders();
        headers_object.append('Content-Type', 'application/json');
        headers_object.append("Authorization", "Bearer " + t);

        const httpOptions = {
          headers: headers_object
        };


   this.http.post(
                  'http://localhost:8000/api/role/Post', {limit:10}, httpOptions
                 ).subscribe(resp => {
                  this.roles = console.log(resp)
                  }
                );
Run Code Online (Sandbox Code Playgroud)

Mar*_*mek 10

添加AuthInterceptor将拦截所有http请求并将令牌添加到其标头中:

import { Injectable } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token = localStorage.token; // you probably want to store it in localStorage or something

    if (!token) {
      return next.handle(req);
    }

    const req1 = req.clone({
      headers: req.headers.set('Authorization', `Bearer ${token}`),
    });

    return next.handle(req1);
  }

}
Run Code Online (Sandbox Code Playgroud)

然后将其注册到您的AppModule

@NgModule({
  declarations: [...],
  imports: [...],
  providers: [
    { provide: HTTP_INTERCEPTORS, useClass: AuthInterceptor, multi: true },
  ],
  bootstrap: [ AppComponent ],
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

有关拦截器的更多信息:

https://angular.io/guide/http#intercepting-requests-and-responses


Dav*_*vid 10

您的代码的问题在于HttpHeaders该类是不可变的,因此在调用append它时,它实际上会返回具有指定值的新实例,但不会修改原始对象。

尝试这个

var headers_object = new HttpHeaders().set("Authorization", "Bearer " + t);
Run Code Online (Sandbox Code Playgroud)

默认情况下,Content-Type设置为json HttpClient

如果您需要在所有API调用中发送一个Authorization令牌,那么最好使用Martin建议的拦截器

  • 现在这意味着标头已正确发送,但您遇到了 CORS 问题。您需要配置 API 来处理 CORS,这是一个不同的主题 (2认同)