Когда я делаю POST-запрос к golang api с помощью POSTMAN, я успешно получаю токен jwt в виде cookie, но когда я делаю это из браузера, я не получаю cookie - PullRequest
1 голос
/ 08 апреля 2019

Я сделал API в Голанге. Backend и веб-интерфейс работают на отдельных серверах. Когда я тестирую API с помощью POSTMAN, все работает нормально, и я получаю куки, содержащие токен jwt, но когда я делаю запрос от внешнего интерфейса, тогда куки не получаются.

Вот промежуточное ПО для обработки CORS:

func corsHandler(h http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        // origin := r.Header.Get("Origin")
        w.Header().Set("Access-Control-Allow-Origin", "http://localhost:5000")
        if r.Method == "OPTIONS" {
            w.Header().Set("Access-Control-Allow-Credentials", "true")
            w.Header().Set("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")

            w.Header().Set("Access-Control-Allow-Headers", "Content-Type, X-CSRF-Token, Authorization, access-control-allow-origin")
            return
        }
        h.ServeHTTP(w, r)
    })
}

Ниже приводится генератор файлов cookie:

    jwtCookie := &http.Cookie{
        Name:   "jwtToken",
        Secure: false,
        HttpOnly: true,
        Value:    tokenString,
        Expires:  expiryTime,
    }

    http.SetCookie(w, jwtCookie)
    w.Header().Add("Access-Control-Allow-Credentials", "true")
    w.WriteHeader(http.StatusOK)

Ниже приводится запрос ajax:

       $.ajax({
            type: 'POST',
            url: 'http://localhost:8080/api/signin',
            data: JSON.stringify({
                "username": $('#username').val(),
                "password": $('#password').val()
            }),
            xhrFields: { withCredentials: true },
            contentType: "application/json",
            dataType: "json",
            success: function(data) {
                console.log(data);
            },
            error: function(message) {
                console.log(message.responseJSON);
            }
        });

В Firefox заголовок ответа выглядит так: Как видно на рисунке 1, cookie получен в заголовке, но не виден в хранилище

В chrome заголовок ответа выглядит так: в Chrome нет файлов cookie

Я застрял на этом довольно долго. Любая помощь будет полезна:)

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Мне пришлось добавить w.Header().Add("Access-Control-Allow-Credentials", "true") для всех запросов, а не только предварительный запрос OPTIONS, а также оказалось, что chrome не показывает cookie в хранилище, но он присутствовал и работал как ожидалось, позже я зарегистрировался в Firefox и cookie был виден в хранилище.

0 голосов
/ 08 апреля 2019

В ответе вашего сервера установите HttpOnly на false и в chrome перейдите в консоль и введите document.cookie. Вы должны увидеть файл cookie, установленный сервером.

Другой вариант, оставить HttpOnly установленным в true. В Chrome откройте инструменты разработчика, перейдите на вкладку Application, вы должны увидеть Cookies в разделе Storage. Нажмите Cookies, и вы увидите файл cookie, установленный сервером.

...