feat: 🤪 cdn配置

main
tian 2 years ago
parent 791c4fdd82
commit fcf1c23b6f

2
.gitignore vendored

@ -2,6 +2,8 @@
/web/node_modules
/web/dist
/server/log
/server/uploads
/server/pychr
.DS_Store

@ -1,6 +1,7 @@
package system
import (
"pychr/plugin/upyun"
"time"
"github.com/gin-gonic/gin"
@ -59,6 +60,57 @@ func (b *BaseApi) Captcha(c *gin.Context) {
}, "验证码获取成功", c)
}
type GetCDNTokenQuery struct {
Method string `form:"method"`
SaveKey string `form:"save_key"`
}
type GetCDNTokenData struct {
Authorization string `json:"authorization"`
Bucket string `json:"bucket"`
Method string `json:"method"`
Policy string `json:"policy"`
Expiration int64 `json:"expiration"`
}
// @Tags CDN
// @Security ApiKeyAuth
// @Summary 获取CDN操作令牌
// @Produce json
// @Param method query int false "方法"
// @Param saveKey query int false "保存关键字"
// @Success 200 {object} structure.GetLoginInformationData{}
// @Router /base/cdn/token [get]
func (b *BaseApi) GetCDNToken(c *gin.Context) {
// method := c.Query("method")
// saveKey := c.Query("saveKey")
var (
q = GetCDNTokenQuery{}
data = GetCDNTokenData{}
token upyun.FormAPIToken
)
err := c.ShouldBindQuery(&q)
if err != nil {
response.FailWithMessage(err.Error(), c)
return
}
token, err = upyun.GetUpYunFormAPIToken(q.Method, q.SaveKey)
if err != nil {
global.GVA_LOG.Error("获取失败!", zap.Error(err))
response.FailWithMessage("获取失败", c)
return
} else {
data.Authorization = token.Authorization
data.Bucket = token.Bucket
data.Method = token.Method
data.Policy = token.Policy
data.Expiration = token.XUpYunExpire
response.OkWithData(gin.H{"data": data}, c)
}
}
// 类型转换
func interfaceToInt(v interface{}) (i int) {
switch v := v.(type) {

@ -0,0 +1,104 @@
package upyun
import (
"crypto/hmac"
"crypto/md5"
"crypto/sha1"
"encoding/base64"
"encoding/hex"
"fmt"
"strconv"
"strings"
"time"
)
var (
bucket = "pychr"
op = "root"
password = "MRnhPT4VlGXAuDEWe4l7JTxrdxbXjZFE"
token = "2cb96a90-b787-43a4-91ec-54d796c069da"
)
const (
effectiveDuration = time.Minute * 60
)
type RestAPIToken struct {
Authorization string
XUpYunUriPrefix string
XUpYunExpire int64
}
func GetUpYunRestAPIUploadToken(method string) (r RestAPIToken) {
now := time.Now()
expire := now.Add(effectiveDuration).Unix()
elem := FilterNoneString([]string{"PUT", "/" + bucket, strconv.FormatInt(expire, 10)})
p := strings.Join(elem, "&")
key := []byte(StringMD5(password))
mac := hmac.New(sha1.New, key)
mac.Write([]byte(p))
hash := mac.Sum(nil)
sign := base64.StdEncoding.EncodeToString(hash)
authorization := "UPYUN " + op + ":" + sign
r.XUpYunExpire = expire
r.Authorization = authorization
r.XUpYunUriPrefix = "/" + bucket
return
}
type FormAPIToken struct {
Bucket string
Method string
Authorization string
XUpYunExpire int64
Policy string
}
func GetUpYunFormAPIToken(method, saveKey string) (r FormAPIToken, err error) {
method = strings.ToUpper(method)
now := time.Now()
expiration := now.Add(effectiveDuration).Unix()
paramsFormat := `{"bucket": "%v", "expiration": %v, "save-key": "%v"}`
params := fmt.Sprintf(paramsFormat, bucket, expiration, saveKey)
policy := StringBase64(params)
elem := FilterNoneString([]string{method, "/" + bucket, policy})
p := strings.Join(elem, "&")
key := []byte(StringMD5(password))
mac := hmac.New(sha1.New, key)
mac.Write([]byte(p))
hash := mac.Sum(nil)
sign := base64.StdEncoding.EncodeToString(hash)
authorization := "UPYUN " + op + ":" + sign
r.Bucket = bucket
r.Method = method
r.XUpYunExpire = expiration
r.Authorization = authorization
r.Policy = policy
return
}
func FilterNoneString(list []string) (r []string) {
for _, t := range list {
if t != "" {
r = append(r, t)
}
}
return
}
// 生成字符串MD5
func StringMD5(s string) string {
h := md5.New()
h.Write([]byte(s))
return hex.EncodeToString(h.Sum(nil))
}
func StringBase64(s string) (r string) {
return base64.StdEncoding.EncodeToString([]byte(s))
}

@ -13,6 +13,7 @@ func (s *BaseRouter) InitBaseRouter(Router *gin.RouterGroup) (R gin.IRoutes) {
{
baseRouter.POST("login", baseApi.Login)
baseRouter.POST("captcha", baseApi.Captcha)
baseRouter.GET("cdn/token", baseApi.GetCDNToken)
}
return baseRouter
}

Loading…
Cancel
Save