Demo 学 Echo Part10 安全的Cookie
使用securecookie非常简单,通过securecookie.New()创建一个安全的cookie对象,然后使用该对象进行编码 - 解码cookie数据操作。调用.New()函数需要2个参数。 第一个,使用HMAC加密算法验证cookie数据需要的哈希密钥 第二个,cookie数据加密需要块密钥,这些密钥是可选的。使用的默认加密算法是AES。
代码中生成随机字符串是通过使用gubrak的第三方库完成的。
package main
import (
"net/http"
"time"
"github.com/gorilla/securecookie"
"github.com/labstack/echo"
"github.com/novalagung/gubrak"
)
type M map[string]interface{}
var sc = securecookie.New([]byte("very-secret"), []byte("a-lot-secret-yay"))
func setCookie(c echo.Context, name string, data M) error {
encoded, err := sc.Encode(name, data)
if err != nil {
return err
}
cookie := &http.Cookie{
Name: name,
Value: encoded,
Path: "/",
Secure: false,
HttpOnly: true,
Expires: time.Now().Add(1 * time.Hour),
}
http.SetCookie(c.Response(), cookie)
return nil
}
func getCookie(c echo.Context, name string) (M, error) {
cookie, err := c.Request().Cookie(name)
if err == nil {
data := M{}
if err = sc.Decode(name, cookie.Value, &data); err == nil {
return data, nil
}
}
return nil, err
}
func main() {
const COOKIE_NAME = "kissjava_cn_data"
e := echo.New()
e.GET("/index", func(c echo.Context) error {
data, err := getCookie(c, COOKIE_NAME)
if err != nil && err != http.ErrNoCookie && err != securecookie.ErrMacInvalid {
return err
}
if data == nil {
data = M{"Message": "Hello", "ID": gubrak.RandomString(32)}
err = setCookie(c, COOKIE_NAME, data)
if err != nil {
return err
}
}
return c.JSON(http.StatusOK, data)
})
e.GET("/delete", func(c echo.Context) error {
cookie := &http.Cookie{}
cookie.Name = COOKIE_NAME
cookie.Path = "/"
cookie.MaxAge = -1
cookie.Expires = time.Unix(0, 0)
http.SetCookie(c.Response(), cookie)
return c.String(http.StatusOK, "Delete Cookie.")
})
e.Logger.Fatal(e.Start(":9000"))
}
测试。
浏览器访问http://localhost:9000/index
应用会先尝试读取Cookie,如果读取不到data==nil
就会生成一个Cookie;
第二次访问可以读取到,然后解码成对应的数据
可以用chrome的调试工具看到cookie的key为kissjava_cn_data
访问http://localhost:9000/delete 会删除cookie;完成后调试工具里也就没有cookie了
最后修改于 2019-08-17