-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmember.go
executable file
·114 lines (103 loc) · 2.82 KB
/
member.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
/**
* Copyright 2015 @ at3.net.
* name : sso.go
* author : jarryliu
* date : 2016-11-25 13:02
* description :
* history :
*/
package module
import (
"fmt"
"github.com/ixre/gof"
"github.com/ixre/gof/crypto"
"github.com/ixre/gof/storage"
"strings"
"time"
)
var _ Module = new(MemberModule)
type MemberModule struct {
app gof.App
storage storage.Interface
tokenHours int64
tokenOffset string
}
// 模块数据
func (m *MemberModule) SetApp(app gof.App) {
m.app = app
m.storage = app.Storage()
}
// 初始化模块
func (m *MemberModule) Init() {
m.tokenHours = 24 * 7 //默认保存7天
m.tokenOffset = ""
}
// 获取会员Token-Key
func (m *MemberModule) getMemberTokenKey(memberId int64) string {
return fmt.Sprintf("go2o:module:member:token:%d", memberId)
}
// 获取会员的Token
func (m *MemberModule) getMemberToken(memberId int64) (string, string) {
var key = m.getMemberTokenKey(memberId)
var pubToken, tokenBase string
pubToken, _ = m.storage.GetString(key)
tokenBase, _ = m.storage.GetString(key + "base")
return pubToken, tokenBase
}
// 获取会员Token
func (m *MemberModule) GetToken(memberId int64) string {
pubToken, _ := m.getMemberToken(memberId)
return pubToken
}
// 检查会员的会话Token是否正确,
func (m *MemberModule) CheckToken(memberId int64, token string) bool {
token = strings.TrimSpace(token)
if len(token) == 0 {
return false
}
pubToken, tokenBase := m.getMemberToken(memberId)
// 清除token
if pubToken == "" || tokenBase == "" {
m.RemoveToken(memberId)
return false
}
// return pubToken == token
//if m.serve.Debug() {
// m.serve.Log().Println("[ Module][ Member]: check token for ",
// memberId, "; ", pubToken, " IN:", token, " equals:",
// pubToken == token, "; Len:", len(pubToken), len(token))
//}
// 验证Token
cyp := crypto.NewUnixCrypto(tokenBase+m.tokenOffset, m.tokenOffset)
b, decBytes, unix := cyp.Compare([]byte(token))
// token不匹配
if !b {
if m.app.Debug() {
m.app.Log().Println("dec:", string(decBytes), "; real:"+tokenBase+m.tokenOffset)
}
return false
}
// token已过期
if unix < time.Now().Add(time.Hour*time.Duration(-m.tokenHours)).Unix() {
m.RemoveToken(memberId)
return false
}
return b
}
// 移除会员Token
func (m *MemberModule) RemoveToken(memberId int64) {
key := m.getMemberTokenKey(memberId)
m.storage.Delete(key)
m.storage.Delete(key + "base")
}
// 重设并返回会员的会员Token,token有效时间默认为60天
func (m *MemberModule) ResetToken(memberId int64, pwd string) string {
cyp := crypto.NewUnixCrypto(pwd+m.tokenOffset, m.tokenOffset)
var token = string(cyp.Encode())
var key = m.getMemberTokenKey(memberId)
// 存储令牌
m.storage.SetExpire(key, token, m.tokenHours*3600)
// 存储令牌凭据
m.storage.SetExpire(key+"base", pwd, m.tokenHours*3600)
return token
}