Angular&Golang“没有访问控制-允许起源...”

时间:2019-06-07 16:48:04

标签: angular go jwt

我正在使用Angular构建前端GUI应用程序,以与用Go语言编写的API服务器进行交互。

我尝试在客户端和服务器的两端添加标头,但是没有运气。我尝试禁用http拦截器,因此它没有添加JWT令牌,在这种情况下,我会收到未授权的访问错误,这是预期的。但是无论我将令牌添加到请求中的任何位置(通过拦截器或在获取请求之前手动添加),未经授权的访问错误都消失了(到目前为止很好),但是随后出现缺少的标头错误。服务器应该返回存储的文章的JSON数据,并且可以与Postman和其他香草JS前端一起使用。

执行代码:

r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  http.ServeFile(w, r, "./index.html")
})

allowedHeaders := handlers.AllowedHeaders([]string{"X-Requested-With"})
allowedOrigins := handlers.AllowedOrigins([]string{"*"})
allowedMethods := handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS"})

r.HandleFunc("/login", GetTokenHandler).Methods("POST")

apiRouter := r.PathPrefix("/api").Subrouter()
apiRouter.Use(jwtMiddleware.Handler)
apiRouter.HandleFunc("/articles", getArticles).Methods("GET")
apiRouter.HandleFunc("/articles/{id}", getArticle).Methods("GET")
apiRouter.HandleFunc("/articles", createArticle).Methods("POST")
apiRouter.HandleFunc("/articles/{id}", updateArticle).Methods("PUT")
apiRouter.HandleFunc("/articles/{id}", deleteArticle).Methods("DELETE")
fmt.Println("Server running on port", port)
log.Fatal(http.ListenAndServe(port, handlers.CORS(allowedHeaders, allowedOrigins, allowedMethods)(r)))

角度获取请求:

this.http.get('http://localhost:8000/api/articles')
.subscribe(res => {
    console.log(res);
},
err => console.log(err));

Angular HttpInterceptor:

export class AuthInterceptor implements HttpInterceptor {

    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

        const token = localStorage.getItem("token");

        if (token) {
            const cloned = req.clone({
                headers: req.headers.append("Authorization", "Bearer " + token)
            });

            return next.handle(cloned);
        }
        else {
            return next.handle(req);
        }
    }
}

我收到此错误:

...请求..已被CORS策略阻止:对预检请求的响应未通过访问控制检查:所请求的资源上没有'Access-Control-Allow-Origin'标头。

编辑:导入:

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "strconv"
    "strings"
    "time"

    jwtmiddleware "github.com/auth0/go-jwt-middleware"
    "github.com/dgrijalva/jwt-go"
    "github.com/gorilla/handlers"
    "github.com/gorilla/mux"
)

2 个答案:

答案 0 :(得分:1)

以下内容将帮助您解决此问题:

1)由于在请求标头中还包括了 Authorization (授权),因此在服务器中允许它似乎丢失了。

2)您可以使用Proxy.config映射到所需的主机(主机名+端口)   a)创建proxy.config.json文件:

{
  "/api/articles": {
    "target": "http://localhost:8000",
    "secure": false
  }
}

b)通过以下命令运行:

ng serve --proxy-config proxy.conf.json

Refer This To Setup Proxy

首先尝试这些事情。

答案 1 :(得分:1)

此问题称为 CORS C 罗斯 O 原装备 R 资源 S 。当请求和响应的来源不同时,就会出现这种情况。例如:如果您的项目位于 https://139.43.33.122:1111/ 上,并且服务器托管在 https://123.0.3.444:3000 上,则请求和响应的来源完全不同因此,浏览器将阻止响应。这是浏览器。邮递员不在乎其来源。要接收响应,有2种方法(也许更多,但我仅使用这2种方法)。

  1. 其他标题::如果您有权访问/允许访问服务器代码,请向服务器响应中添加其他标题: 访问控制允许来源:http://siteA.com,访问控制允许方法:GET,POST,PUT,访问控制允许标题:内容类型

    >
  2. 使用扩展程序:有多个扩展程序可以绕过此限制。如果您没有访问权限或更改服务器响应的权限,那么这就是方法。我个人仅使用此方法。