【问题标题】:Angular 5 HttpInterceptor and sending Authorization Token in headerAngular 5 HttpInterceptor 并在标头中发送授权令牌
【发布时间】:2019-08-16 20:55:35
【问题描述】:

我的流程是登录页面 -> 主页。

登录页面没有token,登录后服务器提供token,用户被重定向到首页。

首页发送token给服务器,token被验证,服务器发回数据显示在前端。

问题:

HttpInterceptor 在登录请求 Cannot read property 'token' of null 时触发。我想让拦截器以某种方式忽略登录 api 请求,并且只在令牌存在的情况下拦截后续调用。

【问题讨论】:

    标签: angular http-headers jwt angular5 angular-http-interceptors


    【解决方案1】:

    您好,您可以在标头中设置一个键值来区分登录和其他请求,并创建一个拦截器来检查该键是否存在以删除令牌

    import { HttpClient, HttpHeaders } from '@angular/common/http';
    ...
    login(username, password) {
        let headers = new HttpHeaders();
        headers = headers.append('noToken', 'noToken');
        return this.http.post(loginUrl, data, {headers: headers})
        ...
    }
    

    然后创建你的拦截器

    export class TokenInterceptor implements HttpInterceptor {
    constructor() {}
    
    intercept(httpReq: HttpRequest<any>, next: HttpHandler): 
     Observable<HttpEvent<any>> {
     let headers = httpReq.headers
      .set('Content-Type', 'application/json');
    
     if (headers.get('noToken') === 'noToken') {
       headers = headers.delete('Authorization').delete('noToken');
     }
    
     const newReq = httpReq.clone({headers: headers});
    
     return next.handle(newReq);
     }
    }
    

    并将其添加到您的应用模块提供程序中

    import { TokenInterceptor } from './token.interceptor';
    
    providers: [
      {
      provide: HTTP_INTERCEPTORS,
      useClass: TokenInterceptor,
      multi: true
     }
    ]
    

    工作解决方案

    auth.interceptor.ts

    export class AuthInterceptor implements HttpInterceptor {
        constructor(public auth: HouseaccountsService) { }
    
        intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
            if(req.headers.get('notoken') !== 'noToken') {
                req = req.clone({
                    setHeaders: {
                        Authorization: JSON.parse(localStorage.getItem('currentUser')).token
                    }
                });
            }
    
            return next.handle(req);
        }
    }
    

    service.ts

    login(user) {
            let loginHeaders = {
                headers: new HttpHeaders({
                    'Content-Type': 'application/json',
                    'noToken': 'noToken'
                })
            }
            return this.http.post<any>(this.url + '/login', JSON.stringify(user), loginHeaders);
        }
    

    【讨论】:

    • 我无法将noToken 标头发送到服务器,但它没有被发送...我将编辑您的答案以显示我所拥有的
    • 如果拦截器罚款 noToken 它将删除它并删除授权检查: if (headers.get('noToken') === 'noToken') { headers = headers.delete('Authorization ').delete('noToken'); }
    • 如何在 Angular 8 的 get 请求中发送 JWT 令牌?
    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    • 2015-05-26
    • 2018-09-22
    • 1970-01-01
    • 2018-02-04
    • 2016-08-03
    • 2019-02-27
    相关资源
    最近更新 更多