-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcrud.go
171 lines (156 loc) · 4.33 KB
/
crud.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package main
import (
"crypto/sha256"
"encoding/hex"
"errors"
"github.com/dgrijalva/jwt-go"
"github.com/google/uuid"
"time"
)
// NewUserByPid 通过平台返回的Pid注册新用户
func NewUserByPid(id int64, method string) error {
h := sha256.New()
h.Write([]byte(uuid.Must(uuid.NewRandom()).String()))
key := hex.EncodeToString(h.Sum(nil))[:32]
var u = &User{
Pid: id,
LoginType: method,
Skey: key,
CreateAt: time.Now().Format("2006-01-02 15:04:05"),
Status: true,
}
_, err := engine.Insert(u)
return err
}
// NewUserByOid 通过平台返回的Oid注册新用户
func NewUserByOid(id string, method string) error {
h := sha256.New()
h.Write([]byte(uuid.Must(uuid.NewRandom()).String()))
key := hex.EncodeToString(h.Sum(nil))[:32]
var u = &User{
Oid: id,
LoginType: method,
Skey: key,
CreateAt: time.Now().Format("2006-01-02 15:04:05"),
Status: true,
}
_, err := engine.Insert(u)
return err
}
// DistributeToken 分发token 依赖ID 该ID是记录ID
func DistributeToken(skey string) (string, error) {
claims := CustomClaims{
Skey: skey,
StandardClaims: jwt.StandardClaims{
ExpiresAt: time.Now().Unix() + conf.Jwt.Expires,
NotBefore: time.Now().Unix(),
IssuedAt: time.Now().Unix(),
Issuer: conf.Jwt.Issuer,
Subject: conf.Jwt.Subject,
},
}
ss, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(conf.Jwt.Skey))
if err != nil {
return "", err
}
return ss, nil
}
// CheckToken 检验token的函数 返回token中的 记录id 以及错误信息
func CheckToken(tokenString string) (int64, error) {
if tokenString == "" {
return 0, errors.New("请求非法")
}
//开始解析
token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{},
func(token *jwt.Token) (interface{}, error) {
return []byte(conf.Jwt.Skey), nil
})
//数据校验
if token == nil {
return 0, errors.New("请求非法")
}
if token.Valid {
if c, ok := token.Claims.(*CustomClaims); ok {
//检测
if u, exist, _ := SearchByKey(c.Skey); !exist {
return 0, errors.New("用户与token不匹配")
} else {
return u.Id, nil
}
}
}
if ve, ok := err.(*jwt.ValidationError); ok {
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
return 0, errors.New("token格式错误")
} else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 {
return 0, errors.New("token已过期")
}
} else {
return 0, errors.New("无法处理该token")
}
return 0, errors.New("未知问题")
}
// SearchByKey 通过key查询用户是否存在
func SearchByKey(key string) (*User, bool, error) {
var u = &User{}
exist, err := engine.Where("skey = ?", key).Get(u)
return u, exist, err
}
// SearchByID 通过记录id查询用户是否存在
func SearchByID(id int64) (*User, bool, error) {
var u = &User{}
exist, err := engine.ID(id).Get(u)
return u, exist, err
}
// SearchByPID 通过Pid查询用户是否存在
func SearchByPID(id int64, loginType string) (*User, bool, error) {
var u = &User{}
exist, err := engine.Where("pid = ? and login_type = ?", id, loginType).Get(u)
return u, exist, err
}
// SearchByOID 通过oid查询用户是否存在
func SearchByOID(oid string, loginType string) (*User, bool, error) {
var u = &User{}
exist, err := engine.Where("oid = ? and login_type = ?", oid, loginType).Get(u)
return u, exist, err
}
func SearchByQQ(qq string) ([]*User, error) {
var list []*User
err := engine.Where("send_to = ?", qq).Find(&list)
return list, err
}
func SearchBySkeyBindWework(skey string) (*WeworkUser, bool, error) {
var u WeworkUser
exist, err := engine.Where("skey = ?", skey).Get(&u)
return &u, exist, err
}
func CreateWeworkUser(event UserChangeEvent) error {
_, err := engine.Insert(&WeworkUser{
Skey: "",
UserId: event.UserID,
Username: event.Name,
})
if err != nil {
log.Errorf("insert user err: %v", err)
return err
}
return nil
}
func UpdateWeworkUser(event UserChangeEvent) error {
//_, err := engine.Where("user_id = ?", event.UserID).Cols("").Update()
//if err != nil {
// log.Errorf("insert user err: %v", err)
// return err
//}
return nil
}
func DeleteWeworkUser(event UserChangeEvent) error {
_, err := engine.Where("user_id = ?", event.UserID).Delete(&WeworkUser{
UserId: event.UserID,
})
if err != nil {
log.Errorf("delete user err: %v", err)
return err
}
return nil
}