我在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,所以,如果可能的话,如何制作它?谢谢!
答案 0 :(得分:0)
您确实可以设置Cookie。
尽管如此,这会让人觉得它太缺乏答案了。请记住,REST API只不过是一个HTTP服务器,它非常严格地使用它应该如何调用它以及它返回什么。因此,您可以安全地设置cookie。
问题是,如果这确实是您应该做的事情,请查看JSON Web Tokens和JSON 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"])
}
}
}