当我使用 POSTMAN 在 golang api 上执行 POST 请求时,我成功地收到了作为 cookie 的 jwt 令牌,但是当我从浏览器执行此操作时,我没有收到任何 cookie
When I do POST request on golang api using POSTMAN I successfully receive the jwt token as a cookie but when I do it from browser I get no cookie
我用golang做了一个API。后端和前端 运行 在不同的服务器上。当我用 POSTMAN 测试 API 时,一切正常,我收到了包含 jwt 令牌的 cookie,但是当我从前端发出请求时,没有收到任何 cookie。
这是处理 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 中,响应 header 如下所示:
As you can see in image 1, the cookie is received in header but it is not visible in storage
在 chrome 中,响应 header 如下所示:
there is no cookie visible in chrome
我纠结了好久。任何帮助都是有价值的:)
在您的服务器响应中,将 HttpOnly
设置为 false,并在 chrome 中转到控制台并键入 document.cookie
。您应该看到服务器设置的 cookie。
另一个选项是,将 HttpOnly
设置为 true。在 chrome 中,打开开发者工具,点击 Application
选项卡,您应该会在 Storage
下看到 Cookies
。单击 Cookies
,您应该会看到服务器设置的 cookie。
我必须为所有请求添加 w.Header().Add("Access-Control-Allow-Credentials", "true")
,而不仅仅是 OPTIONS 预检请求,结果 chrome 没有显示存储中的 cookie,但它存在并且按预期工作,后来我在 firefox 中检查,cookie 在存储中可见。
我用golang做了一个API。后端和前端 运行 在不同的服务器上。当我用 POSTMAN 测试 API 时,一切正常,我收到了包含 jwt 令牌的 cookie,但是当我从前端发出请求时,没有收到任何 cookie。
这是处理 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 中,响应 header 如下所示: As you can see in image 1, the cookie is received in header but it is not visible in storage
在 chrome 中,响应 header 如下所示: there is no cookie visible in chrome
我纠结了好久。任何帮助都是有价值的:)
在您的服务器响应中,将 HttpOnly
设置为 false,并在 chrome 中转到控制台并键入 document.cookie
。您应该看到服务器设置的 cookie。
另一个选项是,将 HttpOnly
设置为 true。在 chrome 中,打开开发者工具,点击 Application
选项卡,您应该会在 Storage
下看到 Cookies
。单击 Cookies
,您应该会看到服务器设置的 cookie。
我必须为所有请求添加 w.Header().Add("Access-Control-Allow-Credentials", "true")
,而不仅仅是 OPTIONS 预检请求,结果 chrome 没有显示存储中的 cookie,但它存在并且按预期工作,后来我在 firefox 中检查,cookie 在存储中可见。