| package common | |
| import ( | |
| "time" | |
| "github.com/alist-org/alist/v3/internal/conf" | |
| "github.com/alist-org/alist/v3/internal/model" | |
| "github.com/golang-jwt/jwt/v4" | |
| "github.com/pkg/errors" | |
| ) | |
| var SecretKey []byte | |
| type UserClaims struct { | |
| Username string `json:"username"` | |
| PwdTS int64 `json:"pwd_ts"` | |
| jwt.RegisteredClaims | |
| } | |
| func GenerateToken(user *model.User) (tokenString string, err error) { | |
| claim := UserClaims{ | |
| Username: user.Username, | |
| PwdTS: user.PwdTS, | |
| RegisteredClaims: jwt.RegisteredClaims{ | |
| ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(conf.Conf.TokenExpiresIn) * time.Hour)), | |
| IssuedAt: jwt.NewNumericDate(time.Now()), | |
| NotBefore: jwt.NewNumericDate(time.Now()), | |
| }} | |
| token := jwt.NewWithClaims(jwt.SigningMethodHS256, claim) | |
| tokenString, err = token.SignedString(SecretKey) | |
| return tokenString, err | |
| } | |
| func ParseToken(tokenString string) (*UserClaims, error) { | |
| token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(token *jwt.Token) (interface{}, error) { | |
| return SecretKey, nil | |
| }) | |
| if err != nil { | |
| if ve, ok := err.(*jwt.ValidationError); ok { | |
| if ve.Errors&jwt.ValidationErrorMalformed != 0 { | |
| return nil, errors.New("that's not even a token") | |
| } else if ve.Errors&jwt.ValidationErrorExpired != 0 { | |
| return nil, errors.New("token is expired") | |
| } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 { | |
| return nil, errors.New("token not active yet") | |
| } else { | |
| return nil, errors.New("couldn't handle this token") | |
| } | |
| } | |
| } | |
| if claims, ok := token.Claims.(*UserClaims); ok && token.Valid { | |
| return claims, nil | |
| } | |
| return nil, errors.New("couldn't handle this token") | |
| } | |