繁体   English   中英

当我使用POSTMAN对golang api进行POST请求时,我成功地将jwt令牌作为cookie接收到,但是当我从浏览器中获取时,没有得到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中,响应标头如下所示: 如图1所示,cookie在标头中接收,但是在存储中不可见

在chrome中,响应标头如下所示: chrome中没有可见的cookie

我在这个问题上停留了很长时间。 任何帮助都是有价值的:)

在服务器响应中,将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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM