这是我的第一个帖子.

我刚刚开始学习围棋和角棋,我正在try 将角棋应用程序连接到围棋API.这两个我都写过了,我不得不找出问题的根源.我认为这是CORS问题,但是如果我不在我的Angular http请求中包括头代码行,它就可以正常工作.在这一点上,我只想添加标题.授权码尚未实现.

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

不起作用的Angular 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;
   }

我收到这个错误:

对飞行前请求的响应未通过访问控制判断:否

我在我的围棋代码中使用了Gorilla/MUX和Gorilla/Handler

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 Dev工具的标题

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

推荐答案

Regarding the best way of handling Authentication headers in Angular > 4 it's best to use
Http Interceptors for adding them to each request, and afterwards using
Guards for protecting your routes.

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

auth.interceptor.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中注册拦截器作为Provider :

应用程序.单元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,
    },
    ...
],

...

你可以在这post篇文章中进一步了解这种方法.


Regarding the Go's side of things, this is most likely a case of mismatch between
Request Headers you're sending and the headers CORS allow.
First thing you should try is allowing all of them:

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

如果问题消失了,试着根据客户发送的内容,仔细地逐个构建你的CORS.

Go相关问答推荐

CGO如何转换为文件*类型

如何使用工作区方法扩展克隆的Golang库

在Golang中Mergesort的递归/并行实现中出现死锁

Go源在Goland(IDEA)中以灰色显示.什么意思?我怎么才能让它恢复正常?

exec的可执行决议.命令+路径

Kusto Go API 从多个表查询

Docker 执行失败并显示cmd/ENTRYPOINT 中的命令未找到

按位移计算结果中的差异

如何将Golang测试用例的测试覆盖率值与特定阈值进行比较

如何解决构建Docker Compose时的权限被拒绝问题

如何从Go项目连接Microsoft Access数据库?

Go struct 匿名字段是公开的还是私有的?

致命错误:找不到由 zergon321/reisen 引起的libavcodec/avcodec.h文件

GqlGen - 在字段解析器中访问查询输入参数

未定义 protoc protoc-gen-go 时间戳

Golang BigInt 部门

curl:(56)Recv失败:连接由golang中的对等方与docker重置

Go:用于 XML 解码的嵌套 struct 中的提升字段

无法识别同步错误.使用一次

Go 泛型是否与 LINQ to Objects 等效?