-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathverifer.go
139 lines (119 loc) · 3.16 KB
/
verifer.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
package sign
import (
"errors"
"fmt"
"net/url"
"strings"
"time"
)
//
// Author: 陈哈哈 chenyongjia@parkingwang.com, yoojiachen@gmail.com
//
type GoVerifier struct {
*DefaultKeyName
body url.Values
timeout time.Duration // 签名过期时间
}
func NewGoVerifier() *GoVerifier {
return &GoVerifier{
DefaultKeyName: newDefaultKeyName(),
body: make(url.Values),
timeout: time.Minute * 5,
}
}
// ParseQuery 将参数字符串解析成参数列表
func (slf *GoVerifier) ParseQuery(requestUri string) error {
requestQuery := ""
idx := strings.Index(requestUri, "?")
if idx > 0 {
requestQuery = requestUri[idx+1:]
}
query, err := url.ParseQuery(requestQuery)
if nil != err {
return err
}
slf.ParseValues(query)
return nil
}
// ParseValues 将Values参数列表解析成参数Map。如果参数是多值的,则将它们以逗号Join成字符串。
func (slf *GoVerifier) ParseValues(values url.Values) {
for key, value := range values {
slf.body[key] = value
}
}
// SetTimeout 设置签名校验过期时间
func (slf *GoVerifier) SetTimeout(timeout time.Duration) *GoVerifier {
slf.timeout = timeout
return slf
}
// MustString 获取字符串值
func (slf *GoVerifier) MustString(key string) string {
if ss := slf.MustStrings(key); len(ss) == 0 {
return ""
} else {
return ss[0]
}
}
// MustString 获取字符串值数组
func (slf *GoVerifier) MustStrings(key string) []string {
return slf.body[key]
}
// MustInt64 获取Int64值
func (slf *GoVerifier) MustInt64(key string) int64 {
return convertToInt64(slf.MustString(key))
}
// MustHasKeys 必须包含指定的字段参数
func (slf *GoVerifier) MustHasKeys(keys ...string) error {
for _, key := range keys {
if _, hit := slf.body[key]; !hit {
return errors.New(fmt.Sprintf("KEY_MISSED:<%s>", key))
}
}
return nil
}
// MustHasKeys 必须包含除特定的[time_stamp, nonce_str, sign, appid]等之外的指定的字段参数
func (slf *GoVerifier) MustHasOtherKeys(keys ...string) error {
fields := []string{slf.keyNameTimestamp, slf.keyNameNonceStr, slf.keyNameSign, slf.keyNameAppId}
if len(keys) > 0 {
fields = append(fields, keys...)
}
return slf.MustHasKeys(fields...)
}
// 检查时间戳有效期
func (slf *GoVerifier) CheckTimeStamp() error {
timestamp := slf.GetTimestamp()
thatTime := time.Unix(timestamp, 0)
if time.Now().Sub(thatTime) > slf.timeout {
return errors.New(fmt.Sprintf("TIMESTAMP_TIMEOUT:<%d>", timestamp))
}
return nil
}
func (slf *GoVerifier) GetAppId() string {
return slf.MustString(slf.keyNameAppId)
}
func (slf *GoVerifier) GetNonceStr() string {
return slf.MustString(slf.keyNameNonceStr)
}
func (slf *GoVerifier) GetSign() string {
return slf.MustString(slf.keyNameSign)
}
func (slf *GoVerifier) GetTimestamp() int64 {
return slf.MustInt64(slf.keyNameTimestamp)
}
// GetBodyWithoutSign 获取所有参数体。其中不包含sign 字段
func (slf *GoVerifier) GetBodyWithoutSign() url.Values {
out := make(url.Values)
for k, v := range slf.body {
if k != slf.keyNameSign {
out[k] = v
}
}
return out
}
func (slf *GoVerifier) GetBody() url.Values {
out := make(url.Values)
for k, v := range slf.body {
out[k] = v
}
return out
}