Отправить пользовательский заголовок в запросе предполетной проверки ВАРИАНТЫ угловые 5 - PullRequest
0 голосов
/ 08 июня 2018

Я создал приложение с angular 5, которое подключается к REST API, разработанному с помощью golang и размещенному на экземпляре aws ec2, работающем на порту 8080. Мой код углового веб-интерфейса создает запрос POST, и перед выполнением этого запроса браузер сначалаотправляет предварительный запрос COR, который завершается неудачно со следующим сообщением об ошибке:

Блокирован перекрестный запрос: одна и та же политика происхождения запрещает чтение удаленного ресурса на https://signup.mysite.com:8080/api/v1/merchant/signup.(Причина: отсутствует токен 'access-control-allow-credentials' в заголовке CORS 'Access-Control-Allow-Headers' из канала предварительной проверки CORS).

Следующие заголовки отправляются браузером взапрос ОПЦИИ к серверу API REST:

Access-Control-Request-Headers : access-control-allow-credentia…rol-allow-origin,content-type
Access-Control-Request-Method : POST

Cors включены на golang, но не уверены, что они работают.Как я могу решить проблему

РЕДАКТИРОВАТЬ Используя следующий код, чтобы добавить заголовок в запросе поста в угловых 5

import { HttpClient, HttpParams, HttpHeaders } from '@angular/common/http';



let headers = new HttpHeaders();
  headers = headers.append('Access-Control-Allow-Origin', '*');
  headers = headers.append('Access-Control-Allow-Credentials', 'true');

  return this.http.post<Response>(this.apiUrl+'merchant/signup', JSON.stringify(formValues),{headers: headers}).map(response => response.response);'true');

Следующий код в файле go

func CORSMiddleware() gin.HandlerFunc {
    return func(c *gin.Context) {
        // host := strings.Split(c.Request.Host, ":8080")
        c.Writer.Header().Set("Content-Type", "application/json")
        // c.Writer.Header().Set("Access-Control-Allow-Origin", "http://"+host[0])
        c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
        c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
        c.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS, PUT, DELETE")
        // c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, Ip, X-Requested-With, access-control-allow-credentials ")
        c.Writer.Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
    }
}

такжепакет с ядрами

router.Use(cors.Default())

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Вы можете отключить CORS во время разработки на своей локальной копии Chrome.Если вы работаете в MAC OS, вы вводите эту команду в терминале:

open -a Google\ Chrome --args --disable-web-security --user-data-dir

На этом шаге отключается ряд (если не все) функций безопасности Chrome, поэтому действуйте с осторожностью.Это устранит вашу ошибку, если у вас нет контроля над серверной стороной, и позволит вам продолжить разработку.

0 голосов
/ 08 июня 2018

Вы должны включить cors из кода на стороне сервера.

func setupResponse(w *http.ResponseWriter, req *http.Request) {
    (*w).Header().Set("Access-Control-Allow-Origin", "*")
    (*w).Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
    (*w).Header().Set("Access-Control-Allow-Headers", "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
}

func yourApi(w http.ResponseWriter, req *http.Request) {
    setupResponse(&w, req) 

    // process the request...
}
...