mirror of
https://github.com/linux-do/new-api.git
synced 2025-11-09 15:43:41 +08:00
feat: 更新令牌生成算法
This commit is contained in:
@@ -1,10 +1,12 @@
|
|||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
crand "crypto/rand"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
"html/template"
|
"html/template"
|
||||||
"log"
|
"log"
|
||||||
|
"math/big"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
@@ -145,21 +147,24 @@ func init() {
|
|||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
}
|
}
|
||||||
|
|
||||||
func GenerateKey() string {
|
func GenerateRandomKey(length int) (string, error) {
|
||||||
//rand.Seed(time.Now().UnixNano())
|
b := make([]byte, length)
|
||||||
key := make([]byte, 48)
|
maxI := big.NewInt(int64(len(keyChars)))
|
||||||
for i := 0; i < 16; i++ {
|
|
||||||
key[i] = keyChars[rand.Intn(len(keyChars))]
|
for i := range b {
|
||||||
}
|
n, err := crand.Int(crand.Reader, maxI)
|
||||||
uuid_ := GetUUID()
|
if err != nil {
|
||||||
for i := 0; i < 32; i++ {
|
return "", err
|
||||||
c := uuid_[i]
|
|
||||||
if i%2 == 0 && c >= 'a' && c <= 'z' {
|
|
||||||
c = c - 'a' + 'A'
|
|
||||||
}
|
}
|
||||||
key[i+16] = c
|
b[i] = keyChars[n.Int64()]
|
||||||
}
|
}
|
||||||
return string(key)
|
|
||||||
|
return string(b), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func GenerateKey() (string, error) {
|
||||||
|
//rand.Seed(time.Now().UnixNano())
|
||||||
|
return GenerateRandomKey(48)
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetRandomInt(max int) int {
|
func GetRandomInt(max int) int {
|
||||||
|
|||||||
@@ -123,10 +123,19 @@ func AddToken(c *gin.Context) {
|
|||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
key, err := common.GenerateKey()
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"success": false,
|
||||||
|
"message": "生成令牌失败",
|
||||||
|
})
|
||||||
|
common.SysError("failed to generate token key: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
cleanToken := model.Token{
|
cleanToken := model.Token{
|
||||||
UserId: c.GetInt("id"),
|
UserId: c.GetInt("id"),
|
||||||
Name: token.Name,
|
Name: token.Name,
|
||||||
Key: common.GenerateKey(),
|
Key: key,
|
||||||
CreatedTime: common.GetTimestamp(),
|
CreatedTime: common.GetTimestamp(),
|
||||||
AccessedTime: common.GetTimestamp(),
|
AccessedTime: common.GetTimestamp(),
|
||||||
ExpiredTime: token.ExpiredTime,
|
ExpiredTime: token.ExpiredTime,
|
||||||
|
|||||||
@@ -200,11 +200,20 @@ func Register(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
// 生成默认令牌
|
// 生成默认令牌
|
||||||
if constant.GenerateDefaultToken {
|
if constant.GenerateDefaultToken {
|
||||||
|
key, err := common.GenerateKey()
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"success": false,
|
||||||
|
"message": "生成默认令牌失败",
|
||||||
|
})
|
||||||
|
common.SysError("failed to generate token key: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
// 生成默认令牌
|
// 生成默认令牌
|
||||||
token := model.Token{
|
token := model.Token{
|
||||||
UserId: insertedUser.Id, // 使用插入后的用户ID
|
UserId: insertedUser.Id, // 使用插入后的用户ID
|
||||||
Name: cleanUser.Username + "的初始令牌",
|
Name: cleanUser.Username + "的初始令牌",
|
||||||
Key: common.GenerateKey(),
|
Key: key,
|
||||||
CreatedTime: common.GetTimestamp(),
|
CreatedTime: common.GetTimestamp(),
|
||||||
AccessedTime: common.GetTimestamp(),
|
AccessedTime: common.GetTimestamp(),
|
||||||
ExpiredTime: -1, // 永不过期
|
ExpiredTime: -1, // 永不过期
|
||||||
@@ -311,7 +320,18 @@ func GenerateAccessToken(c *gin.Context) {
|
|||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
user.SetAccessToken(common.GetUUID())
|
// get rand int 28-32
|
||||||
|
randI := common.GetRandomInt(4)
|
||||||
|
key, err := common.GenerateRandomKey(29 + randI)
|
||||||
|
if err != nil {
|
||||||
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
"success": false,
|
||||||
|
"message": "生成失败",
|
||||||
|
})
|
||||||
|
common.SysError("failed to generate key: " + err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
user.SetAccessToken(key)
|
||||||
|
|
||||||
if model.DB.Where("access_token = ?", user.AccessToken).First(user).RowsAffected != 0 {
|
if model.DB.Where("access_token = ?", user.AccessToken).First(user).RowsAffected != 0 {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
|
|||||||
Reference in New Issue
Block a user