84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package utils
|
|
|
|
// jwt身份验证demo
|
|
|
|
import (
|
|
"github.com/dgrijalva/jwt-go"
|
|
"math/rand"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// 设置jwt密钥secret
|
|
var jwtSecret = []byte("qinglong")
|
|
|
|
type Claims struct {
|
|
UserID string `json:"userid"`
|
|
jwt.StandardClaims
|
|
}
|
|
|
|
// GenerateToken 生成token的函数
|
|
func GenerateToken(userid string, hour int) (string, error) {
|
|
nowTime := time.Now()
|
|
expireTime := nowTime.Add(time.Duration(hour) * time.Hour)
|
|
|
|
claims := Claims{
|
|
userid, // 自行添加的信息
|
|
jwt.StandardClaims{
|
|
ExpiresAt: expireTime.Unix(), // 设置token过期时间
|
|
Issuer: "gin-blog", // 设置jwt签发者
|
|
},
|
|
}
|
|
// 生成token
|
|
tokenClaims := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
|
|
token, err := tokenClaims.SignedString(jwtSecret)
|
|
|
|
return token, err
|
|
}
|
|
|
|
// ParseToken 验证token的函数
|
|
func ParseToken(token string) (*Claims, error) {
|
|
// 对token的密钥进行验证
|
|
tokenClaims, err := jwt.ParseWithClaims(token, &Claims{}, func(token *jwt.Token) (interface{}, error) {
|
|
return jwtSecret, nil
|
|
})
|
|
|
|
// 判断token是否过期
|
|
if tokenClaims != nil {
|
|
if claims, ok := tokenClaims.Claims.(*Claims); ok && tokenClaims.Valid {
|
|
return claims, nil
|
|
}
|
|
}
|
|
|
|
return nil, err
|
|
}
|
|
|
|
func IsMobile(userAgent string) bool {
|
|
if len(userAgent) == 0 {
|
|
return false
|
|
}
|
|
|
|
isMobile := false
|
|
mobileKeywords := []string{"Mobile", "Android", "Silk/", "Kindle",
|
|
"BlackBerry", "Opera Mini", "Opera Mobi", "app"}
|
|
|
|
for i := 0; i < len(mobileKeywords); i++ {
|
|
if strings.Contains(userAgent, mobileKeywords[i]) {
|
|
isMobile = true
|
|
break
|
|
}
|
|
}
|
|
|
|
return isMobile
|
|
}
|
|
|
|
func RandomString(n int) string {
|
|
var letter = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-?")
|
|
rand.Seed(time.Now().UnixMilli())
|
|
b := make([]rune, n)
|
|
for i := range b {
|
|
b[i] = letter[rand.Intn(len(letter))]
|
|
}
|
|
return string(b)
|
|
}
|