登录
首页 >  Golang >  Go问答

POST 请求通过 POSTMAN 获取 jwt 令牌成功,但在浏览器中未收到 cookie

来源:stackoverflow

时间:2024-02-29 13:36:26 177浏览 收藏

“纵有疾风来,人生不言弃”,这句话送给正在学习Golang的朋友们,也希望在阅读本文《POST 请求通过 POSTMAN 获取 jwt 令牌成功,但在浏览器中未收到 cookie》后,能够真的帮助到大家。我也会在后续的文章中,陆续更新Golang相关的技术文章,有好的建议欢迎大家在评论留言,非常感谢!

问题内容

我用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 在 header 中被接收,但在存储中不可见

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

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


解决方案


我必须为所有请求添加 w.Header().Add("Access-Control-Allow-Credentials", "true") 而不仅仅是 OPTIONS 预检请求,而且事实证明 chrome 没有显示cookie 在存储中,但它存在并按预期工作,后来我在 firefox 中检查,并且 cookie 在存储中可见。

在服务器响应中,将 HttpOnly 设置为 false,在 chrome 中,转到控制台并输入 document.cookie。您应该会看到服务器设置的 cookie。

另一个选项是将 HttpOnly 设置为 true。在chrome中,打开开发者工具,单击Application选项卡,您应该在Storage下看到Cookies。单击 Cookies,您应该会看到服务器设置的 cookie。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>