首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在角6中发送JWT令牌作为授权标头

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

Stack Overflow用户
提问于 2018-09-23 16:30:11
回答 5查看 51.9K关注 0票数 18

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

代码语言:javascript
运行
复制
    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)
                  }
                );
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-09-23 17:05:14

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

尝尝这个

代码语言:javascript
运行
复制
var headers_object = new HttpHeaders().set("Authorization", "Bearer " + t);

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

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

票数 20
EN

Stack Overflow用户

发布于 2018-09-23 16:47:06

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

代码语言:javascript
运行
复制
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中注册

代码语言:javascript
运行
复制
@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

票数 32
EN

Stack Overflow用户

发布于 2020-10-24 09:14:21

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

不需要创建拦截器,只需更新AppModule:

代码语言:javascript
运行
复制
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 { }

任何使用角的HttpClient发送的请求都会自动附加一个令牌作为授权头。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52468071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档