Я сделал 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
Я застрял на этом довольно долго. Любая помощь будет полезна:)