118 lines
2.2 KiB
Go
118 lines
2.2 KiB
Go
|
|
package middleware
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"bytes"
|
|||
|
|
"encoding/json"
|
|||
|
|
"fmt"
|
|||
|
|
"github.com/gin-gonic/gin"
|
|||
|
|
"io"
|
|||
|
|
"net/http"
|
|||
|
|
"time"
|
|||
|
|
"xiawan/wx/db"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
**
|
|||
|
|
认证
|
|||
|
|
*/
|
|||
|
|
func BasicAuth() gin.HandlerFunc {
|
|||
|
|
return func(c *gin.Context) {
|
|||
|
|
auth := c.Request.Header.Get("Authorization")
|
|||
|
|
if auth == "" {
|
|||
|
|
RsqK(c, "授权码不能为空")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
modelAuth := &Auth{}
|
|||
|
|
var key = fmt.Sprintf("api:auth:%s", auth)
|
|||
|
|
modelAuth = GetCacheAuth(key)
|
|||
|
|
if modelAuth == nil {
|
|||
|
|
rsq := Get("http://119.45.28.143:8000/api/v1/auth?key=" + auth)
|
|||
|
|
if err := json.Unmarshal([]byte(rsq), &modelAuth); err == nil {
|
|||
|
|
if modelAuth.Data == 200 {
|
|||
|
|
CacheAuthAdd(key, modelAuth)
|
|||
|
|
c.Next()
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
RsqK(c, modelAuth.Msg)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
if modelAuth.Data == 200 {
|
|||
|
|
CacheAuthAdd(key, modelAuth)
|
|||
|
|
c.Next()
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
RsqK(c, modelAuth.Msg)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func RsqK(c *gin.Context, msg string) {
|
|||
|
|
c.AbortWithStatus(http.StatusCreated)
|
|||
|
|
respVo := &RespVo{
|
|||
|
|
Code: http.StatusOK,
|
|||
|
|
Message: msg,
|
|||
|
|
Data: http.StatusCreated,
|
|||
|
|
}
|
|||
|
|
c.JSON(http.StatusOK, respVo)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type Auth struct {
|
|||
|
|
Code int32
|
|||
|
|
Data int32
|
|||
|
|
Msg string
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// {"code":0,"message":"","data":""}
|
|||
|
|
type RespVo struct {
|
|||
|
|
Code int `json:"code"`
|
|||
|
|
Message string `json:"message"`
|
|||
|
|
Data interface{} `json:"data"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 发送GET请求
|
|||
|
|
// url: 请求地址
|
|||
|
|
// response: 请求返回的内容
|
|||
|
|
func Get(url string) string {
|
|||
|
|
// 超时时间:15秒
|
|||
|
|
client := &http.Client{Timeout: 15 * time.Second}
|
|||
|
|
resp, err := client.Get(url)
|
|||
|
|
if err != nil {
|
|||
|
|
panic(err)
|
|||
|
|
}
|
|||
|
|
defer resp.Body.Close()
|
|||
|
|
var buffer [512]byte
|
|||
|
|
result := bytes.NewBuffer(nil)
|
|||
|
|
for {
|
|||
|
|
n, err := resp.Body.Read(buffer[0:])
|
|||
|
|
result.Write(buffer[0:n])
|
|||
|
|
if err != nil && err == io.EOF {
|
|||
|
|
break
|
|||
|
|
} else if err != nil {
|
|||
|
|
panic(err)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return result.String()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 添加授权缓存
|
|||
|
|
func CacheAuthAdd(key string, val *Auth) {
|
|||
|
|
cache := db.GetCaChe()
|
|||
|
|
isContains := cache.Contains(key)
|
|||
|
|
if !isContains {
|
|||
|
|
cache.Set(key, val, time.Hour*1)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 查询授权缓存
|
|||
|
|
func GetCacheAuth(key string) *Auth {
|
|||
|
|
cache := db.GetCaChe()
|
|||
|
|
isContains := cache.Contains(key)
|
|||
|
|
if !isContains {
|
|||
|
|
return nil
|
|||
|
|
}
|
|||
|
|
return cache.Get(key).(*Auth)
|
|||
|
|
}
|