-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
94 lines (86 loc) · 2.32 KB
/
main.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
package main
import (
"WebApiGo/tools"
"flag"
"fmt"
"github.com/gin-gonic/gin"
"github.com/juju/ratelimit"
"math"
"net/http"
"strconv"
"strings"
"time"
)
const (
UserTokenSalt = "default_salt"
AdminTokenSalt = "admin_salt"
)
var adminRoute = []string{"/wxpush/send"}
func main() {
tools.InitSeed()
tools.InitDb()
port := flag.String("port", "8005", "端口")
rate := flag.Float64("rate", 0, "每秒最大访问次数")
flag.Parse()
router := gin.Default() //获得路由实例
router.GET("/status", isOk)
exists, err := tools.PathExists("debug")
if exists && err == nil {
gin.SetMode(gin.DebugMode)
fmt.Println("当前为测试环境")
} else {
gin.SetMode(gin.ReleaseMode)
router.Use(Authorize)
if *rate > 0 {
router.Use(RateLimitMiddleware(*rate, 1))
}
fmt.Println("当前为线上环境")
}
//注册接口
wxPushGroup := router.Group("/wxpush")
{
wxPushGroup.GET("/send", tools.WxPushSendHandler)
wxPushGroup.GET("/update", tools.WxPushUpdateHandler)
wxPushGroup.GET("/clean", tools.WxPushCleanHandler)
}
//监听端口
fmt.Println("启动端口为:", *port)
err = http.ListenAndServe(fmt.Sprintf(":%s", *port), router)
if err != nil {
fmt.Println(err)
return
}
}
func isOk(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"code": 200, "msg": "isOk"})
}
func Authorize(c *gin.Context) {
t := c.Query("t") // 时间戳
token := c.Query("token") // 访问令牌
timeStamp, _ := strconv.ParseInt(t, 10, 64)
nowTimeStamp := time.Now().Unix()
saltToken := UserTokenSalt
if tools.IsInStrSlice(c.FullPath(), adminRoute) {
saltToken = AdminTokenSalt
}
if strings.ToLower(tools.MD5([]byte(t+saltToken))) == strings.ToLower(token) && math.Abs(float64(nowTimeStamp-timeStamp)) < 30 {
// 验证通过,会继续访问下一个中间件
c.Next()
} else {
// 验证不通过,不再调用后续的函数处理
c.Abort()
c.JSON(http.StatusUnauthorized, gin.H{"message": "访问未授权"})
}
}
func RateLimitMiddleware(rate float64, capacity int64) func(c *gin.Context) {
bucket := ratelimit.NewBucketWithRate(rate, capacity)
return func(c *gin.Context) {
// 如果取不到令牌就中断本次请求返回 rate limit...
if !bucket.WaitMaxDuration(1, 3*time.Second) {
c.JSON(http.StatusOK, gin.H{"code": 403, "msg": "rate limit..."})
c.Abort()
return
}
c.Next()
}
}