gs系统涉及的技术


1、web的登录状态保持方式:JWT

解决问题:账号安全验证
登录之后的状态保持,后台核心数据需要校验权限等。一系列涉及账号安全问题都需要我们进行-**签名验签,保持账号信息的可靠性**

状态保持:因为http是一种无状态协议,浏览器请求服务器是无状态的
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求
无状态原因:浏览器与服务器之间使用socket套接字进行通讯,服务器将请求结果返回给浏览器后,会关闭当前的socket连接,而且服务器也会在处理页面完毕之后销毁页面对象

web应用状态保持的几种方式:Cookie,Session,Token(JWT)

(1)Token

原理:服务端根据规范生成一个令牌(token),并且发放给客户端。此时客户端请求服务端的时候就可以携带者令牌,以令牌来证明自己的身份信息。

(1.1)自定义token

在我的子应用中创建一个utils模块,里面定义了两个方法,一个用来随机生成token,一个用来校验token;

//随机生成token:根据用户id(源数据)和密钥(盐, 不同项目不同盐值),生成token
func get_token(id string) string {
	salt := iniConfigYaml() //从config文件读出salt值
	s := []byte(salt)

	// 方法一:通过Sum传参
	// data := []byte(id)
	// s := fmt.Sprintf("%x", md5.Sum(data))
	// fmt.Println(s)

	// 方法二:通过Write传参
	i := []byte(id)
	h := md5.New()
	h.Write(i)
	// 若要加盐的话,在第二种方式的基础上再把salt給write进去,如下所示:
	h.Write(s)

	return hex.EncodeToString(h.Sum(nil)) + "|" + id
}

//校验token
func check_token(token string) bool {
	salt := iniConfigYaml() //从config文件读出salt值
	s := []byte(salt)

	strs := bytes.Split([]byte(token), []byte("|"))
	result := strs[0] // 加密后的
	i := strs[1]      //id

	h := md5.New()
	h.Write(i)
	h.Write(s)

	newResult := hex.EncodeToString(h.Sum(nil))
	fmt.Println(string(result), newResult)
	if string(result) == newResult {
		return true
	} else {
		return false
	}
}

使用:

func main() {
	token := get_token("sybilId")
	fmt.Println(token)
	fmt.Println(check_token(token))
}
//运行结果:
b29b4c6954ee4b08085d9d5cfd6bdf43|sybilId
true

至于具体如何实现账号安全验证,具体的前后台交互代码,参考下面链接。

(1.2)JWT

JWT:Json Web Token,是基于Json的一个公开规范。JWT是一种Token的实现。
我们使用JWT在用户和服务器之间传递安全可靠的信息,他的两大使用场景是:认证和数据交换。

JWT由三部分组成,分别是header(头部), playload(负载), signature(签名),

签名需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,
然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分signature形式如下:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

参考:
https://blog.csdn.net/xiaodsadwwq/article/details/107763004【python实现的】

2、Go读取各种配置文件

配置文件结构体:config.go
全局配置:global.go

一、读取json

三、读取yaml
config.yaml
config.go
global.go
test_http.go-iniConfigYaml(),读yaml文件,Unmarshal,输出数值

四、

五、万能的viper

参考: