清风徐来
Michael's Blog
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