【问题标题】:How to send JWT token as authorization header in angular 6如何在角度 6 中发送 JWT 令牌作为授权标头
【发布时间】:2019-02-27 07:12:50
【问题描述】:

目前我在组件 .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)
                  }
                );

【问题讨论】:

标签: angular angular-http-interceptors angular2-jwt


【解决方案1】:

另一种解决方案是使用angular-jwt:https://github.com/auth0/angular2-jwt

无需创建拦截器,只需更新您的 AppModule:

import { JwtModule } from "@auth0/angular-jwt";
import { HttpClientModule } from "@angular/common/http";

export function tokenGetter() {
    return localStorage.getItem('access_token');
}

@NgModule({
    declarations: [
        AppComponent
    ],
    imports: [
        HttpClientModule,
        JwtModule.forRoot({
            config: {
                tokenGetter: tokenGetter,
                allowedDomains: ['localhost:3000', 'example.com'],
                disallowedRoutes: ["http://example.com/examplebadroute/"],
                authScheme: "Bearer " // Default value
            }
        })
    ],
    bootstrap: [AppComponent]
})
export class AppModule { }

使用 Angular 的 HttpClient 发送的任何请求都将自动具有 作为授权标头附加的令牌。

【讨论】:

    【解决方案2】:
    import { Injectable } from '@angular/core';
    import {
      HttpEvent, HttpInterceptor, HttpHandler, HttpRequest
    } from '@angular/common/http';
    
    import { Observable } from 'rxjs';
    
    /** Pass untouched request through to the next request handler. */
    @Injectable()
    export class NoopInterceptor implements HttpInterceptor {
      intercept(req: HttpRequest<any>, next: HttpHandler):
        Observable<HttpEvent<any>> {
          return next.handle(req);
        }
    }
    

    拦截器能够在你的 Header 中添加令牌

    通过下面的 URL https://angular.io/guide/http#intercepting-requests-and-responses

    【讨论】:

      【解决方案3】:

      请像这样创建 HttpHeaders 对象(而不是附加),

      var t="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODAwMFwvYXBpXC9sb2dpbiIsImlhdCI6MTUzNzcxNTMyNSwiZXhwIjoxNTM3NzE4OTI1LCJuYmYiOjE1Mzc3MTUzMjUsImp0aSI6IlBKWVhnSkVyblQ0WjdLTDAiLCJzdWIiOjYsInBydiI6Ijg3ZTBhZjFlZjlmZDE1ODEyZmRlYzk3MTUzYTE0ZTBiMDQ3NTQ2YWEifQ.1vz5lwPlg6orzkBJijsbBNZrnFnUedsGJUs7BUs0tmM";
      
          var headers_object = new HttpHeaders({
            'Content-Type': 'application/json',
             '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)
                        }
                      );
      

      【讨论】:

        【解决方案4】:

        你的代码的问题是HttpHeaders类是不可变的,所以当你调用append它实际上返回一个具有指定值的新实例,但不修改原始对象。

        试试这个

        var headers_object = new HttpHeaders().set("Authorization", "Bearer " + t);
        

        Content-Type 默认被HttpClient设置为json

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

        【讨论】:

        • 对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'localhost:4200' 不允许访问。响应的 HTTP 状态代码为 403。我不知道为什么会出现此错误,因为它与查询字符串一起工作正常。
        • 现在这意味着标头已正确发送,但您遇到了 CORS 问题。你需要配置你的 API 来处理 CORS,这是一个不同的话题
        • 因为使用查询字符串的时候,没有添加自定义头部
        • 谢谢大佬终于解决了我的问题,你是对的,按照你的步骤是CORS问题。
        【解决方案5】:

        添加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);
          }
        
        }
        

        然后在你的AppModule注册:

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

        更多关于拦截器:

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

        【讨论】:

          猜你喜欢
          • 2015-09-27
          • 2015-04-25
          • 1970-01-01
          • 2019-12-25
          • 2021-07-22
          • 2016-03-08
          • 2021-02-09
          • 1970-01-01
          • 2020-03-09
          相关资源
          最近更新 更多