【问题标题】:Making Global Authorization Header in HttpClient Interceptor在 HttpClient 拦截器中制作全局授权标头
【发布时间】:2017-09-25 02:23:08
【问题描述】:

我正在我的应用程序中创建一个全局授权标头。我已经使用了拦截器,所以我不会在我的 get() 函数中声明授权标头。我是否正确实现了拦截器,因为当我调用 get() 函数时,它仍然要求令牌。它说没有提供令牌。我的 auth.interceptor 有问题吗?我应该在每个 get() 函数中声明授权标头不记名令牌吗?我认为每次发送/接收请求时都会调用拦截器?

auth.interceptor.ts

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
    private authService: AuthService;

    constructor(private injector: Injector) {}

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // Get the auth header from the service.
        this.authService = this.injector.get(AuthService);
        const token = this.authService.getToken();
            if (token) {
                req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) });
            }

            if (!req.headers.has('Content-Type')) {
                req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') });
            }

            req = req.clone({ headers: req.headers.set('Accept', 'application/json') });
            return next.handle(req);
        }
}

products.component.ts

getAll() {
    return this.httpClient.get<any>(this.url).map(response => response.json());
    }

【问题讨论】:

    标签: angular angular-http-interceptors angular-httpclient angular-http-auth


    【解决方案1】:

    你做对了!

    拦截器用于拦截所有http调用,您可以更改全局请求。

    我认为问题在于这些条件。您可以调试它们并解决它们。

                if (token) {
                    req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) });
                }
    
                if (!req.headers.has('Content-Type')) {
                    req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') });
                }
    

    也许有些他们返回 null!

    但如果时间是获取令牌的问题,您可以进行异步调用以获取令牌。

    this.authService.LoginUser().subscribe(( token) => { 
       if (token) { 
         req = req.clone({ headers: req.headers.set('Authorization', 'Bearer ' + token) }); 
       } 
    
       if (!req.headers.has('Content-Type')) { 
         req = req.clone({ headers: req.headers.set('Content-Type', 'application/json') }); 
       } 
    
       req = req.clone({ headers: req.headers.set('Accept', 'application/json') }); 
       return next.handle(req); 
    } 
    });
    

    【讨论】:

    • 尝试调试它。可能是 content-type 没有听到
    • 但是为什么我可以登录我的应用程序?我该如何调试它>
    • 放一些断点,看看执行到这里,一切正常。还有一件事。我确定你在你的模块中添加了这个拦截器,对吧?
    • 是的。在核心模块中。不在应用程序模块中。核心模块导出到应用模块
    • 可能您需要将其添加到应用程序模块中作为其引导模块。所以放一个断点,看看在执行过程中调用是否到了这里
    猜你喜欢
    • 2019-06-05
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2020-12-16
    相关资源
    最近更新 更多