如何将授权标头添加到 Angular http 请求?

新手上路,请多包涵

这是我的第一篇文章。

我刚开始学习 Go 和 Angular,我正在尝试将 Angular 应用程序连接到 go api。我已经写了两个并且无法确定问题的根源。我认为这是一个 CORS 问题,但如果我不在我的 Angular http 请求中包含标头代码行,它就可以正常工作。在这一点上,我只是想添加标题。授权代码尚未实现。

这两个应用程序都在本地运行,Go 应用程序在端口 5000 上,Angular 在 4200 上

不起作用的角度 http 请求:

 this.http.get<ProjectedBalance>(requestUrl, {headers: new HttpHeaders().set('Authorization', 'my-auth-token')})
    .subscribe(data => {
     this.projBalance = data.projBalance;
   }

有效的角度 http 请求:

 this.http.get<ProjectedBalance>(requestUrl)
    .subscribe(data => {
     this.projBalance = data.projBalance;
   }

我收到此错误:

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问源“ http://localhost:4200 ”。响应具有 HTTP 状态代码 403

我在我的 go 代码中使用了 gorilla/mux 和 gorilla/handlers

 router := mux.NewRouter()
router.HandleFunc("/home/{endDate}", GetProjBalance).Methods("GET", "OPTIONS")
headersOk := handlers.AllowedHeaders([]string{"X-Requested-With, Content-Type, Authorization"})
originsOk := handlers.AllowedOrigins([]string{"*"})
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})
//start server on port
log.Fatal(http.ListenAndServe(":5000", handlers.CORS(originsOk, headersOk, methodsOk)(router)))

来自 Chrome 开发工具的标头

Request URL:http://localhost:5000/home/2020-12-21
Request Method:OPTIONS
Status Code:403 Forbidden
Remote Address:[::1]:5000
Referrer Policy:no-referrer-when-downgrade

Response Headers
view source
Content-Length:0
Content-Type:text/plain; charset=utf-8
Date:Mon, 20 Nov 2017 21:39:43 GMT

Request Headers
view source
Accept:*/*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.9,uz;q=0.8
Access-Control-Request-Headers:authorization
Access-Control-Request-Method:GET
Connection:keep-alive
Host:localhost:5000
Origin:http://localhost:4200

原文由 gobuckeyes2 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 524
2 个回答

关于在 Angular > 4 中处理身份验证标头的最佳方式,最好使用

Http Interceptors 将它们添加到每个请求中,然后使用

Guards 用于保护您的路线。

这是我在我的应用程序中使用的 AuthInterceptor 的完整示例:

auth.拦截器.ts

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

import { Observable } from 'rxjs/Observable';

import { AuthService } from './auth.service';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    req = req.clone({
      setHeaders: {
        'Content-Type' : 'application/json; charset=utf-8',
        'Accept'       : 'application/json',
        'Authorization': `Bearer ${AuthService.getToken()}`,
      },
    });

    return next.handle(req);
  }
}

您需要在 app.module 中注册您的拦截器作为提供者:

应用程序模块.ts

 import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
import { AuthInterceptor } from '../auth/auth.interceptor';

...

imports: [
    HttpClientModule,
    ...
],
providers: [
    {
      provide : HTTP_INTERCEPTORS,
      useClass: AuthInterceptor,
      multi   : true,
    },
    ...
],

...

您可以在这篇 文章 中进一步了解此方法。


关于 Go 的方面,这很可能是两者之间不匹配的情况

您发送的 请求 标头和 CORS 允许的标头。

您应该尝试的第一件事是允许所有这些:

 headersOk := handlers.AllowedHeaders([]string{"*"})
originsOk := handlers.AllowedOrigins([]string{"*"})
methodsOk := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "OPTIONS"})

如果问题消失了,请尝试根据客户发送的内容逐一仔细构建您的 CORS

原文由 Mihailo 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您不想添加拦截器,这对我有用:

 var header = {
  headers: new HttpHeaders()
    .set('Authorization',  `Basic ${btoa(AuthService.getToken())}`)
}

this.http.get(url, header)

对于承载,

 set('Authorization',  `Bearer ${AuthService.getToken()}`)

原文由 Adrita Sharma 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题