zjxpcyc 6 anni fa
parent
commit
896392137a

+ 131
- 105
controllers/auth.go Vedi File

@@ -3,7 +3,7 @@ package controllers
3 3
 import (
4 4
 	"errors"
5 5
 	"net/http"
6
-	"spaceofcheng/services/models/model"
6
+	"spaceofcheng/services/models"
7 7
 	"spaceofcheng/services/service"
8 8
 	"spaceofcheng/services/utils"
9 9
 	"strings"
@@ -19,14 +19,70 @@ func (c *BaseController) authenticate() {
19 19
 	// 客户端类型
20 20
 	clientType := utils.GetClientType(c.Ctx.Request)
21 21
 
22
+	switch clientType {
23
+	case utils.ClientAdmin:
24
+		c.authPCAdmin(serv)
25
+	case utils.ClientWechat:
26
+		c.authWechat(serv)
27
+	default:
28
+		c.ResponseError(
29
+			errors.New("暂不支持的 API 场景"),
30
+			http.StatusBadRequest,
31
+		)
32
+	}
33
+}
34
+
35
+// authPCAdmin PC管理端
36
+func (c *BaseController) authPCAdmin(serv *service.SysServ) {
37
+	if !c.needAuth() {
38
+		return
39
+	}
40
+
41
+	// 用户ID
42
+	userID := ""
43
+	userIDRaw := c.GetSession(SNUserID)
44
+	if userIDRaw != nil {
45
+		userID = userIDRaw.(string)
46
+	}
47
+
48
+	if userID == "" {
49
+		c.ResponseError(
50
+			errors.New("用户未登录"),
51
+			http.StatusUnauthorized,
52
+		)
53
+	}
54
+
55
+	if err := serv.SetUserProfile(userID); err != nil {
56
+		utils.LogError(err.Error())
57
+
58
+		c.ResponseError(
59
+			errors.New("内部错误, 请重试"),
60
+			http.StatusInternalServerError,
61
+		)
62
+	}
63
+
64
+	// 设置 Session
65
+	c.SetSession(SNUserID, userID)
66
+	// c.SetSession(SNUserType, userType)
67
+}
68
+
69
+func (c *BaseController) authWechat(serv *service.SysServ) {
22 70
 	// 用户类型, 此处与数据库定义的不是一个概念
23 71
 	// 此处主要用来区分是 系统用户, 还是 系统客户
24
-	userType := UserGuest
72
+	userType := ""
25 73
 	userTypeRaw := c.GetSession(SNUserType)
26 74
 	if userTypeRaw != nil {
27 75
 		userType = userTypeRaw.(string)
28 76
 	}
29 77
 
78
+	if userType == "" {
79
+		userType = models.USERMAP_CUSTOMER
80
+		identify := c.GetString("identify_type")
81
+		if identify == "admin" {
82
+			userType = models.USERMAP_USER
83
+		}
84
+	}
85
+
30 86
 	// 用户类型不同, 此处ID代表的内容也是不一样的
31 87
 	userID := ""
32 88
 	userIDRaw := c.GetSession(SNUserID)
@@ -34,52 +90,45 @@ func (c *BaseController) authenticate() {
34 90
 		userID = userIDRaw.(string)
35 91
 	}
36 92
 
37
-	// 用户映射表
38
-	var userMap *model.TaUserMapping
39
-
40
-	if clientType == utils.ClientWechat && userID == "" {
41
-		var err error
42
-		userMap, err = c.checkWechat(serv)
43
-		if err != nil {
44
-			utils.LogError("获取并校验微信信息失败: " + err.Error())
45
-		}
46
-
47
-		c.SetSession("openid", userMap.Openid)
93
+	// 用户微信信息
94
+	var wxDetail map[string]interface{}
95
+	detailRaw := c.GetSession("wechat_user")
96
+	if detailRaw != nil {
97
+		wxDetail = detailRaw.(map[string]interface{})
48 98
 	}
49 99
 
50
-	if !c.needAuth() {
51
-		return
100
+	if userID == "" && wxDetail == nil {
101
+		wxDetail = c.getWechatDetail()
102
+		c.SetSession("wechat_user", wxDetail)
52 103
 	}
53 104
 
54
-	// 如果是普通游客, 暂时没有任何设置
55
-	if userType == UserGuest {
56
-		return
105
+	// 用户映射
106
+	// 如果映射不存在, 则新建映射
107
+	userMap, err := serv.CheckWechatUserMapping(wxDetail, userType)
108
+	if err != nil {
109
+		c.ResponseError(
110
+			utils.LogError("获取人员映射账户失败: "+err.Error()),
111
+			http.StatusInternalServerError,
112
+		)
113
+
114
+		c.Context.Set("userMap", *userMap)
57 115
 	}
58 116
 
59
-	// 如果存在用户映射
60
-	mapUserID := c.getUserIDByUserMap(userMap, userID, userType)
61
-	if mapUserID != "" {
62
-		userID = mapUserID
117
+	if !c.needAuth() {
118
+		return
63 119
 	}
64 120
 
65
-	// 未登录状态
66
-	if userID == "" {
67
-		if clientType == utils.ClientWechat {
68
-			wxConf, ok := c.Configer[WeChatConf]
69
-			if ok {
70
-				c.ResponseData(
71
-					map[string]interface{}{
72
-						"appid": wxConf.String("appid"),
73
-					},
74
-					errors.New("用户未登录"),
75
-					http.StatusUnauthorized,
76
-				)
77
-			} else {
78
-				c.ResponseError(
79
-					errors.New("用户未登录"),
80
-					http.StatusUnauthorized,
81
-				)
82
-			}
121
+	// 未登录或者绑定, 返回 401
122
+	if userID == "" && userMap.UserId == "" {
123
+		wxConf, ok := c.Configer[WeChatConf]
124
+		if ok {
125
+			c.ResponseData(
126
+				map[string]interface{}{
127
+					"appid": wxConf.String("appid"),
128
+				},
129
+				errors.New("用户未登录"),
130
+				http.StatusUnauthorized,
131
+			)
83 132
 		} else {
84 133
 			c.ResponseError(
85 134
 				errors.New("用户未登录"),
@@ -88,26 +137,42 @@ func (c *BaseController) authenticate() {
88 137
 		}
89 138
 	}
90 139
 
91
-	// 设置 Session
92
-	c.SetSession(SNUserID, userID)
93
-	c.SetSession(SNUserType, userType)
140
+	// 人员微信账号绑定错误
141
+	if userID != "" && userMap.UserId != "" &&
142
+		(userID != userMap.UserId || userType != userMap.UserType) {
143
+		c.ResponseError(
144
+			errors.New("系统内部数据错误, 人员绑定不正确"),
145
+			http.StatusInternalServerError,
146
+		)
147
+	}
94 148
 
95
-	var err error
149
+	if userID == "" {
150
+		userID = userMap.UserId
151
+	}
96 152
 
97
-	// 设置 Context
98
-	// 放到 serv 的方法里面了
99
-	if userType == UserAdmin {
100
-		// 普通管理人员
101
-		err = serv.SetUserProfile(userID)
153
+	if userType == models.USERMAP_USER {
154
+		if err := serv.SetUserProfile(userID); err != nil {
155
+			utils.LogError(err.Error())
102 156
 
157
+			c.ResponseError(
158
+				errors.New("内部错误, 请重试"),
159
+				http.StatusInternalServerError,
160
+			)
161
+		}
103 162
 	} else {
104
-		// 系统客户
105
-		err = serv.SetCustomer(userID)
106
-	}
163
+		if err := serv.SetCustomer(userID); err != nil {
164
+			utils.LogError(err.Error())
107 165
 
108
-	if err != nil {
109
-		// 暂不处理
166
+			c.ResponseError(
167
+				errors.New("内部错误, 请重试"),
168
+				http.StatusInternalServerError,
169
+			)
170
+		}
110 171
 	}
172
+
173
+	// 设置 Session
174
+	c.SetSession(SNUserID, userID)
175
+	c.SetSession(SNUserType, userType)
111 176
 }
112 177
 
113 178
 func (c *BaseController) needAuth() bool {
@@ -122,63 +187,24 @@ func (c *BaseController) needAuth() bool {
122 187
 	return true
123 188
 }
124 189
 
125
-func (c *BaseController) checkWechat(serv *service.SysServ) (*model.TaUserMapping, error) {
126
-	// 确定客户端类型
127
-	adminClient := c.GetString("admin")
128
-	userType := service.USERTYPE_CUSTOMER
129
-	if adminClient != "" {
130
-		userType = service.USERTYPE_USER
131
-	}
132
-
133
-	openIDRaw := c.GetSession("openid")
134
-	if openIDRaw != nil {
135
-		openID := openIDRaw.(string)
136
-		wxUser := map[string]interface{}{
137
-			"openid": openID,
138
-		}
139
-		return serv.CheckWechatUserMapping(wxUser, userType)
140
-	}
141
-
190
+// getWechatDetail 获取微信个人信息详情
191
+func (c *BaseController) getWechatDetail() map[string]interface{} {
142 192
 	// 微信 code
143 193
 	code := c.GetString("code")
144 194
 	if code == "" {
145
-		return nil, errors.New("没有微信 code")
195
+		c.ResponseError(
196
+			errors.New("没有接收到微信 code"),
197
+			http.StatusBadRequest,
198
+		)
146 199
 	}
147 200
 
148
-	// 获取微信信息
149
-	wxUser, err := utils.GetWxUserInfo(code)
201
+	usr, err := utils.GetWxUserInfo(code)
150 202
 	if err != nil {
151
-		return nil, err
152
-	}
153
-
154
-	return serv.CheckWechatUserMapping(wxUser, userType)
155
-}
156
-
157
-// getUserIDByUserMap 校验用户映射是否与 Session 一致
158
-func (c *BaseController) getUserIDByUserMap(user *model.TaUserMapping, userID, userType string) string {
159
-	// 如果映射信息不存在
160
-	if user == nil {
161
-		return ""
162
-	}
163
-
164
-	// 如果 session 数据存在, 以 session 为准
165
-	if userID != "" {
166
-		return ""
167
-	}
168
-
169
-	// 如果是系统内置用户
170
-	if user.UserType == service.USERTYPE_USER {
171
-		if userType != UserAdmin {
172
-			return ""
173
-		}
174
-	}
175
-
176
-	// 如果是普通客户
177
-	if user.UserType == service.USERTYPE_CUSTOMER {
178
-		if userType != UserCustomer {
179
-			return ""
180
-		}
203
+		c.ResponseError(
204
+			utils.LogError("获取微信个人信息失败: "+err.Error()),
205
+			http.StatusInternalServerError,
206
+		)
181 207
 	}
182 208
 
183
-	return user.UserId
209
+	return usr
184 210
 }

+ 1
- 0
controllers/context.go Vedi File

@@ -11,6 +11,7 @@ import (
11 11
 * - 包含内容如下
12 12
 * user					用户基本信息
13 13
 * customer			会员基本信息
14
+* userMap				用户/会员 映射第三方账户
14 15
 * cases					用户所有案场信息
15 16
 * currentCase 	当前案场
16 17
 * org						用户当前组织

+ 2
- 2
controllers/session.go Vedi File

@@ -7,6 +7,6 @@ const (
7 7
 	// 用户类型
8 8
 	SNUserType = "userType"
9 9
 
10
-	// 内置 openid
11
-	// 请勿使用 openid 作为 session 的key
10
+	// 内置 wechat_user
11
+	// 请勿使用 wechat_user 作为 session 的key
12 12
 )

+ 0
- 7
controllers/types.go Vedi File

@@ -1,12 +1,5 @@
1 1
 package controllers
2 2
 
3
-// 用户类型列表
4
-const (
5
-	UserGuest    = "guest"
6
-	UserAdmin    = "admin"
7
-	UserCustomer = "customer"
8
-)
9
-
10 3
 // JSONMessage 主要用于 Response 返回
11 4
 type JSONMessage struct {
12 5
 	Code    int         `json:"code"`

+ 85
- 0
controllers/user/user.go Vedi File

@@ -1,10 +1,14 @@
1 1
 package user
2 2
 
3 3
 import (
4
+	"errors"
5
+	"net/http"
4 6
 	"spaceofcheng/services/controllers"
5 7
 	"spaceofcheng/services/models/model"
6 8
 	"spaceofcheng/services/models/system"
7 9
 	"spaceofcheng/services/service"
10
+	"spaceofcheng/services/utils"
11
+	"time"
8 12
 )
9 13
 
10 14
 // UserController 用户
@@ -127,3 +131,84 @@ func (c *UserController) GetUserCustomer() {
127 131
 	}
128 132
 	c.ResponseJSON(customers)
129 133
 }
134
+
135
+// SignIn 用户登录
136
+func (c *UserController) SignIn() {
137
+	userName := c.GetString("username")
138
+	userPassword := c.GetString("userpassword")
139
+	token := c.GetString("token")
140
+	doRemember, _ := c.GetInt("doremember")
141
+
142
+	if token != "" {
143
+		tokenMap, err := utils.PareseToken(token)
144
+		if err != nil {
145
+			utils.LogError("解析用户 token 失败: " + err.Error())
146
+
147
+			c.ResponseError(
148
+				errors.New("登录失败, 用户名或者密码不正确"),
149
+				http.StatusBadRequest,
150
+			)
151
+		}
152
+
153
+		userName = tokenMap["user"].(string)
154
+		userPassword = tokenMap["password"].(string)
155
+	}
156
+
157
+	user, err := c.dao.CheckUserSignIn(userName, userPassword)
158
+	if err != nil {
159
+		utils.LogError("用户登录失败: " + err.Error())
160
+		c.ResponseError(
161
+			errors.New("登录失败, 用户名或者密码不正确"),
162
+			http.StatusBadRequest,
163
+		)
164
+	}
165
+
166
+	// 成功之后, 设置 session
167
+	c.SetSession(controllers.SNUserID, user.UserId)
168
+	c.SetSession(controllers.SNUserType, service.USERTYPE_USER)
169
+
170
+	if token == "" && doRemember != 0 {
171
+		var err error
172
+		token, err = utils.CreateToken(map[string]interface{}{
173
+			"user":     userName,
174
+			"password": userPassword,
175
+			"exp":      time.Now().Local().Add(7 * 24 * time.Hour), // 有效期是 7 天
176
+		})
177
+
178
+		if err != nil {
179
+			utils.LogError("生成 用户登录 token 失败: " + err.Error())
180
+		}
181
+	}
182
+
183
+	c.ResponseJSON(map[string]interface{}{
184
+		token: token,
185
+	})
186
+}
187
+
188
+// SignOut 用户登出
189
+func (c *UserController) SignOut() {
190
+	c.DestroySession()
191
+	c.ResponseJSON("ok")
192
+}
193
+
194
+// WechatSignIn 微信登录
195
+func (c *UserController) WechatSignIn() {
196
+	phone := c.GetString("phone")
197
+	captcha := c.GetString("captcha")
198
+
199
+	if !utils.ValidCaptcha(phone, captcha) {
200
+		c.ResponseError(errors.New("手机号或验证码不正确"))
201
+	}
202
+
203
+	userMapping := c.Context.Get("userMap").(model.TaUserMapping)
204
+
205
+	user, err := c.dao.BindWechatUser(&userMapping, phone)
206
+	if err != nil {
207
+		c.ResponseError(err)
208
+	}
209
+
210
+	c.SetSession(controllers.SNUserID, user.UserId)
211
+	c.SetSession(controllers.SNUserType, service.USERTYPE_USER)
212
+
213
+	c.ResponseJSON("ok")
214
+}

+ 6
- 0
models/constant.go Vedi File

@@ -17,3 +17,9 @@ const (
17 17
 	ACCMAP_WECHAT = "wechat"
18 18
 	ACCMAP_MINI   = "mini"
19 19
 )
20
+
21
+// 映射表用户类型
22
+const (
23
+	USERMAP_USER     = "user"
24
+	USERMAP_CUSTOMER = "customer"
25
+)

+ 73
- 0
models/customer/customer.go Vedi File

@@ -0,0 +1,73 @@
1
+package customer
2
+
3
+import (
4
+	"spaceofcheng/services/models"
5
+	"spaceofcheng/services/utils"
6
+
7
+	"github.com/go-xorm/xorm"
8
+)
9
+
10
+// CustomerDAO 当前数据库操作对象
11
+type CustomerDAO struct {
12
+	ctx *utils.Context
13
+	db  *xorm.Session
14
+}
15
+
16
+// NewCustomerDAO New Inst
17
+func NewCustomerDAO(ctx *utils.Context) *CustomerDAO {
18
+	return &CustomerDAO{
19
+		ctx: ctx,
20
+		db:  ctx.DB,
21
+	}
22
+}
23
+
24
+// CustWithWXList 客户列表
25
+func (m *CustomerDAO) CustWithWXList(phone string, page ...int) ([]CustWithWX, error) {
26
+	if phone == "" {
27
+		phone = "%"
28
+	} else {
29
+		phone = "%" + phone + "%"
30
+	}
31
+
32
+	pageNum := 10
33
+	if m.ctx.Get("pageNum") != nil {
34
+		pageNum = m.ctx.Get("pageNum").(int)
35
+	}
36
+
37
+	pg := 1
38
+	if len(page) > 0 {
39
+		pg = page[0]
40
+	}
41
+	offset := (pg - 1) * pageNum
42
+	if offset < 0 {
43
+		offset = 0
44
+	}
45
+
46
+	query := `
47
+		SELECT *
48
+		FROM
49
+			ta_customer t
50
+		LEFT JOIN ta_user_mapping s ON t.customer_id = s.user_id
51
+			AND s.user_type = '` + models.USERMAP_CUSTOMER + `'
52
+			AND s.account_type = '` + models.ACCMAP_WECHAT + `'
53
+		WHERE
54
+			t.tel like ?
55
+		AND t.status > ?
56
+		ORDER BY
57
+			t.create_date DESC
58
+		LIMIT ? OFFSET ?	
59
+	`
60
+
61
+	var cust []CustWithWX
62
+	if err := m.db.SQL(
63
+		query,
64
+		phone,
65
+		models.STATUS_DEL,
66
+		pageNum,
67
+		offset,
68
+	).Find(&cust); err != nil {
69
+		return nil, err
70
+	}
71
+
72
+	return cust, nil
73
+}

+ 11
- 0
models/customer/types.go Vedi File

@@ -0,0 +1,11 @@
1
+package customer
2
+
3
+import (
4
+	"spaceofcheng/services/models/model"
5
+)
6
+
7
+// CustWithWX 客户及微信相关信息
8
+type CustWithWX struct {
9
+	model.TaCustomer    `xorm:"extends"`
10
+	model.TaUserMapping `xorm:"extends"`
11
+}

+ 43
- 0
models/system/user.go Vedi File

@@ -1,6 +1,7 @@
1 1
 package system
2 2
 
3 3
 import (
4
+	"errors"
4 5
 	"spaceofcheng/services/models"
5 6
 	"spaceofcheng/services/models/model"
6 7
 	"spaceofcheng/services/utils"
@@ -328,3 +329,45 @@ func (m *UserDAO) GetUserCustomer(userid string, page int, pageSize int) ([]mode
328 329
 	err := m.db.Where("status>"+strconv.Itoa(models.STATUS_DEL)).And("recommend_id=?", userid).Limit(pageSize, page*pageSize).Desc("create_date").Find(&customers)
329 330
 	return customers, err
330 331
 }
332
+
333
+// GetUserByName 依据账户获取人员信息
334
+func (m *UserDAO) GetUserByName(userName string) (*model.SysUser, error) {
335
+	user := model.SysUser{}
336
+
337
+	has, err := m.db.Where("user_name=?", userName).Get(&user)
338
+	if err != nil {
339
+		return nil, err
340
+	}
341
+
342
+	if !has {
343
+		return nil, nil
344
+	}
345
+
346
+	return &user, nil
347
+}
348
+
349
+// GetUserByPhone 依据手机号获取人员信息
350
+func (m *UserDAO) GetUserByPhone(phone string) (*model.SysUser, error) {
351
+	user := model.SysUser{}
352
+
353
+	has, err := m.db.Where("phone=?", phone).Get(&user)
354
+	if err != nil {
355
+		return nil, err
356
+	}
357
+
358
+	if !has {
359
+		return nil, nil
360
+	}
361
+
362
+	return &user, nil
363
+}
364
+
365
+// UpdateUserMapping 更新用户映射
366
+func (m *UserDAO) UpdateUserMapping(userMap *model.TaUserMapping, cols []string) error {
367
+	if userMap.MappingId == "" {
368
+		return errors.New("用户映射信息不存在")
369
+	}
370
+
371
+	_, err := m.db.Where("mapping_id=?", userMap.MappingId).Cols(cols...).Update(&userMap)
372
+	return err
373
+}

+ 55
- 5
service/user.go Vedi File

@@ -2,6 +2,7 @@ package service
2 2
 
3 3
 import (
4 4
 	"errors"
5
+	"spaceofcheng/services/models"
5 6
 	"spaceofcheng/services/models/model"
6 7
 	"spaceofcheng/services/models/system"
7 8
 	"spaceofcheng/services/utils"
@@ -9,11 +10,6 @@ import (
9 10
 	"github.com/yl10/kit/encrypt"
10 11
 )
11 12
 
12
-const (
13
-	USERTYPE_USER     = "user"
14
-	USERTYPE_CUSTOMER = "customer"
15
-)
16
-
17 13
 // UserServ 系统处理
18 14
 type UserServ struct {
19 15
 	ctx     *utils.Context
@@ -244,3 +240,57 @@ func (s *UserServ) GetUserCustomer(userid string, page int, pageSize int) ([]mod
244 240
 	customers, err := s.dao.GetUserCustomer(userid, page, pageSize)
245 241
 	return customers, err
246 242
 }
243
+
244
+// CheckUserSignIn 校验用户登录
245
+func (s *UserServ) CheckUserSignIn(userName, userPassword string) (*model.SysUser, error) {
246
+	user, err := s.dao.GetUserByName(userName)
247
+	if err != nil {
248
+		return nil, err
249
+	}
250
+
251
+	if user == nil {
252
+		return nil, errors.New("账户不存在")
253
+	}
254
+
255
+	if user.Status != models.STATUS_NORMAL {
256
+		return nil, errors.New("用户账户异常")
257
+	}
258
+
259
+	if !s.dao.ValidatePassword(user, userPassword) {
260
+		return nil, errors.New("用户密码不正确")
261
+	}
262
+
263
+	return user, nil
264
+}
265
+
266
+// BindWechatUser 绑定微信用户
267
+func (s *UserServ) BindWechatUser(userMap *model.TaUserMapping, phone string) (*model.SysUser, error) {
268
+	user, err := s.dao.GetUserByPhone(phone)
269
+	if err != nil {
270
+		return nil, err
271
+	}
272
+
273
+	if user == nil {
274
+		return nil, errors.New("手机号对应用户不存在")
275
+	}
276
+
277
+	if user.Status != models.STATUS_NORMAL {
278
+		return nil, errors.New("用户状态不正确")
279
+	}
280
+
281
+	if user.UserId == userMap.UserId {
282
+		return user, nil
283
+	}
284
+
285
+	if userMap.UserId != "" {
286
+		return nil, errors.New("内部错误, 用户映射信息有误")
287
+	}
288
+
289
+	userMap.UserId = user.UserId
290
+	if err := s.dao.UpdateUserMapping(userMap, []string{"user_id"}); err != nil {
291
+		utils.LogError("更新用户映射信息失败:" + err.Error())
292
+		return nil, errors.New("映射用户信息失败")
293
+	}
294
+
295
+	return user, nil
296
+}

+ 11
- 0
utils/captcha.go Vedi File

@@ -0,0 +1,11 @@
1
+package utils
2
+
3
+// SendCaptcha 发送验证码
4
+func SendCaptcha(k string) error {
5
+	return nil
6
+}
7
+
8
+// ValidCaptcha 验证 验证码
9
+func ValidCaptcha(k, cap string) bool {
10
+	return true
11
+}

+ 34
- 0
utils/jwt.go Vedi File

@@ -0,0 +1,34 @@
1
+package utils
2
+
3
+import (
4
+	"errors"
5
+
6
+	jwt "github.com/dgrijalva/jwt-go"
7
+)
8
+
9
+var tokenSignedKey = []byte(`Yansen is so handsome!`)
10
+
11
+// CreateToken 获取token
12
+func CreateToken(info map[string]interface{}) (string, error) {
13
+	claims := jwt.MapClaims(info)
14
+	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
15
+	return token.SignedString(tokenSignedKey)
16
+}
17
+
18
+// PareseToken 解析 token
19
+func PareseToken(token string) (map[string]interface{}, error) {
20
+	tk, err := jwt.Parse(token, func(t *jwt.Token) (interface{}, error) {
21
+		return tokenSignedKey, nil
22
+	})
23
+
24
+	if err != nil {
25
+		return nil, err
26
+	}
27
+
28
+	if claims, ok := tk.Claims.(jwt.MapClaims); ok && tk.Valid {
29
+		info := map[string]interface{}(claims)
30
+		return info, nil
31
+	}
32
+
33
+	return nil, errors.New("Token 解析 未知错误")
34
+}