107 lines
2.2 KiB
Go
107 lines
2.2 KiB
Go
package common
|
||
|
||
import (
|
||
"crypto/ecdsa"
|
||
"crypto/elliptic"
|
||
"crypto/rand"
|
||
"drive-linked/config"
|
||
"drive-linked/pkg/utils"
|
||
"github.com/golang-jwt/jwt/v4"
|
||
"github.com/kataras/golog"
|
||
"io/ioutil"
|
||
"os"
|
||
"time"
|
||
)
|
||
|
||
type JwtClaims struct {
|
||
Foo string `json:"foo"`
|
||
jwt.RegisteredClaims
|
||
}
|
||
|
||
var ECDSAKey *ecdsa.PrivateKey
|
||
|
||
// 生成ES256密钥对,并保存在文件中
|
||
func init() {
|
||
// 密钥对存在时跳过
|
||
//TODO:bug:会重复生成key
|
||
if isExist := utils.FileExist("id_ecdsa") && utils.FileExist("id_ecdsa.pub"); isExist {
|
||
return
|
||
}
|
||
|
||
key, err := newES256Key()
|
||
if err != nil {
|
||
golog.Fatal("生成ES256密钥错误")
|
||
}
|
||
|
||
// 写入至文件
|
||
pubKeyBytes, err := utils.EncodePublicKey(&key.PublicKey)
|
||
if err != nil {
|
||
golog.Fatal(err)
|
||
}
|
||
priKeyBytes, err := utils.EncodePrivateKey(key)
|
||
if err != nil {
|
||
golog.Fatal(err)
|
||
}
|
||
|
||
priKeyFile, err := os.OpenFile("id_ecdsa", os.O_CREATE, 0600)
|
||
if err != nil {
|
||
golog.Fatal(err)
|
||
}
|
||
pubKeyFile, err := os.OpenFile("id_ecdsa.pub", os.O_CREATE, 0655)
|
||
if err != nil {
|
||
golog.Fatal(err)
|
||
}
|
||
priKeyFile.Write(priKeyBytes)
|
||
pubKeyFile.Write(pubKeyBytes)
|
||
}
|
||
|
||
func newES256Key() (key *ecdsa.PrivateKey, err error) {
|
||
key, err = ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
||
return key, err
|
||
}
|
||
|
||
func LoadKey() error {
|
||
if ECDSAKey != nil {
|
||
return nil
|
||
}
|
||
|
||
priKeyBytes, err := ioutil.ReadFile(config.Cfg.Security.Jwt.PrivateKey)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
key, err := utils.DecodePrivateKey(priKeyBytes)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
ECDSAKey = key
|
||
return nil
|
||
}
|
||
|
||
//TODO:token解密验证
|
||
func ValidateLogin(token string) error {
|
||
return nil
|
||
}
|
||
|
||
func NewToken(auds ...string) (string, error) {
|
||
// Create the claims
|
||
claims := JwtClaims{
|
||
"bar",
|
||
jwt.RegisteredClaims{
|
||
// A usual scenario is to set the expiration time relative to the current time
|
||
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(config.Cfg.Security.Jwt.Expire) * time.Second)),
|
||
IssuedAt: jwt.NewNumericDate(time.Now()),
|
||
NotBefore: jwt.NewNumericDate(time.Now()),
|
||
Issuer: "drivelinked",
|
||
Subject: "login",
|
||
Audience: []string{"eigeen"},
|
||
},
|
||
}
|
||
|
||
token := jwt.NewWithClaims(jwt.SigningMethodES256, claims)
|
||
ss, err := token.SignedString(ECDSAKey)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
return ss, nil
|
||
}
|