navidrome/core/auth/auth.go

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

68 lines
1.6 KiB
Go
Raw Normal View History

2020-02-06 22:48:35 +01:00
package auth
import (
"context"
2020-02-06 22:48:35 +01:00
"sync"
"time"
2021-05-11 23:21:18 +02:00
"github.com/go-chi/jwtauth/v5"
"github.com/lestrrat-go/jwx/v2/jwt"
"github.com/navidrome/navidrome/conf"
2020-02-06 22:48:35 +01:00
"github.com/navidrome/navidrome/consts"
"github.com/navidrome/navidrome/log"
"github.com/navidrome/navidrome/model"
)
var (
2021-05-12 00:55:58 +02:00
once sync.Once
Secret []byte
TokenAuth *jwtauth.JWTAuth
2020-02-06 22:48:35 +01:00
)
2021-05-12 00:55:58 +02:00
func Init(ds model.DataStore) {
2020-02-06 22:48:35 +01:00
once.Do(func() {
2021-05-12 00:55:58 +02:00
log.Info("Setting Session Timeout", "value", conf.Server.SessionTimeout)
secret, err := ds.Property(context.TODO()).DefaultGet(consts.JWTSecretKey, "not so secret")
2020-02-06 22:48:35 +01:00
if err != nil {
log.Error("No JWT secret found in DB. Setting a temp one, but please report this error", err)
}
2021-04-30 16:00:03 +02:00
Secret = []byte(secret)
TokenAuth = jwtauth.New("HS256", Secret, nil)
2020-02-06 22:48:35 +01:00
})
}
func CreateToken(u *model.User) (string, error) {
2021-05-11 23:21:18 +02:00
claims := map[string]interface{}{}
claims[jwt.IssuerKey] = consts.JWTIssuer
claims[jwt.IssuedAtKey] = time.Now().UTC().Unix()
claims[jwt.SubjectKey] = u.UserName
claims["uid"] = u.ID
2020-02-06 22:48:35 +01:00
claims["adm"] = u.IsAdmin
2021-05-11 23:21:18 +02:00
token, _, err := TokenAuth.Encode(claims)
if err != nil {
return "", err
}
2020-02-06 22:48:35 +01:00
return TouchToken(token)
}
2021-05-11 23:21:18 +02:00
func TouchToken(token jwt.Token) (string, error) {
claims, err := token.AsMap(context.Background())
if err != nil {
return "", err
2021-04-30 16:00:03 +02:00
}
2020-02-06 22:48:35 +01:00
2021-05-12 00:55:58 +02:00
claims[jwt.ExpirationKey] = time.Now().UTC().Add(conf.Server.SessionTimeout).Unix()
2021-05-11 23:21:18 +02:00
_, newToken, err := TokenAuth.Encode(claims)
return newToken, err
2021-04-30 16:00:03 +02:00
}
2021-05-11 23:21:18 +02:00
func Validate(tokenStr string) (map[string]interface{}, error) {
token, err := jwtauth.VerifyToken(TokenAuth, tokenStr)
2020-02-06 22:48:35 +01:00
if err != nil {
return nil, err
}
2021-05-11 23:21:18 +02:00
return token.AsMap(context.Background())
2020-02-06 22:48:35 +01:00
}