在API Rest golang中发送cookie

时间:2017-05-12 19:20:02

标签: rest cookies go

我在Golang工作,我正在构建一个API-Rest,我想知道,我可以使用restful设置cookie吗? 我正在构建与用户身份验证相关的方法:登录,注销,注册等等,现在我正在尝试使用生成的uuid在响应中设置cookie。我有这个:

func Login(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
              ...some code....
      c := &http.Cookie{
        Name:  "session",
        Value: uuid.NewV4().String(),
      }
    http.SetCookie(w, c)

    w.Header().Set("Content-Type", "application/json; charset=UTF-8")
    json.NewEncoder(w).Encode(user)
    w.WriteHeader(fasthttp.StatusOK)
}

但是在回复中我没有得到任何cookie,所以,如果可能的话,如何制作它?谢谢!

1 个答案:

答案 0 :(得分:0)

您确实可以设置Cookie。

尽管如此,这会让人觉得它太缺乏答案了。请记住,REST API只不过是一个HTTP服务器,它非常严格地使用它应该如何调用它以及它返回什么。因此,您可以安全地设置cookie。

问题是,如果这确实是您应该做的事情,请查看JSON Web TokensJSON Web Encryption。两个都有Go库。使用JWE和JWT而不是cookie的理由是,您通常希望REST API尽可能无状态;更喜欢客户保持状态。

如果您坚持使用Cookie,请考虑使用Gorilla的securecookie API,因为您可能不希望有人偷看您的Cookie内容。您可以这样使用它:

import "github.com/gorilla/securecookie"

s := securecoookie.New([]byte("very-secret-1234"), byte[]("much-hidden-5678"))

func SetCookieHandler(w http.ResponseWriter, r *http.Request) {
    value := map[string]string{
        "foo": "bar",
    }
    if encoded, err := s.Encode("cookie-name", value); err == nil {
        cookie := &http.Cookie{
            Name:  "cookie-name",
            Value: encoded,
            Path:  "/",
            Secure: true,
            HttpOnly: true,
        }
        http.SetCookie(w, cookie)
    }
}

同样,您可以检索Cookie的内容,如下所示:

func ReadCookieHandler(w http.ResponseWriter, r *http.Request) {
    if cookie, err := r.Cookie("cookie-name"); err == nil {
        value := make(map[string]string)
        if err = s2.Decode("cookie-name", cookie.Value, &value); err == nil {
            fmt.Fprintf(w, "The value of foo is %q", value["foo"])
        }
    }
}