60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package util
|
|
|
|
import (
|
|
"crypto/md5"
|
|
"encoding/base64"
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"fmt"
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
type Entity struct {
|
|
Username string `json:"username"`
|
|
Token string `json:"token"`
|
|
}
|
|
|
|
type AuthEntity struct {
|
|
Entity
|
|
Time int64 `json:"time"`
|
|
Authtoken string `json:"authtoken"`
|
|
}
|
|
|
|
func VerifyAuth(a *AuthEntity, salt string) bool {
|
|
current := time.Now()
|
|
if current.Sub(time.Unix(a.Time, 0)).Minutes() > 5 {
|
|
return false
|
|
}
|
|
|
|
return a.Authtoken == GenAuthToken(a, salt)
|
|
}
|
|
|
|
func GenAuthToken(a *AuthEntity, salt string) string {
|
|
str := fmt.Sprintf("%s:%s:%d:%s", a.Username, a.Token, a.Time, salt)
|
|
h := md5.New()
|
|
h.Write([]byte(str))
|
|
return hex.EncodeToString(h.Sum(nil))
|
|
}
|
|
|
|
func ParseAuthEntity(str string) (a *AuthEntity, err error) {
|
|
dbytes, err := base64.StdEncoding.DecodeString(str)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
a = new(AuthEntity)
|
|
err = json.Unmarshal(dbytes, a)
|
|
return a, err
|
|
}
|
|
|
|
func GenRandomstring(n int) string {
|
|
// 生成长度为n的随机字符串
|
|
// rand.Seed(time.Now().UnixNano())
|
|
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
|
b := make([]byte, n)
|
|
for i := range b {
|
|
b[i] = letterBytes[rand.Intn(len(letterBytes))]
|
|
}
|
|
return string(b)
|
|
}
|