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
参考: