Prevent startup on empty secret
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
Jan Bader 2022-03-01 18:33:46 +00:00
parent 6dd8a3791f
commit dae6185857
2 changed files with 25 additions and 10 deletions

View File

@ -29,11 +29,14 @@ func main() {
panic("couldn't open static files") panic("couldn't open static files")
} }
tokenVerifier, err := jwt.NewTokenVerifier(cfg.SessionSecret)
if err != nil {
panic("couldn't create token verifier")
}
handler := &server.Handler{ handler := &server.Handler{
Service: queries, Service: queries,
TokenVerifier: &jwt.TokenVerifier{ TokenVerifier: tokenVerifier,
Secret: cfg.SessionSecret,
},
CredentialsVerifier: &bcrypt.Verifier{}, CredentialsVerifier: &bcrypt.Verifier{},
StaticFS: http.FS(static), StaticFS: http.FS(static),
} }

View File

@ -11,8 +11,20 @@ import (
) )
// TokenVerifier verifies Tokens. // TokenVerifier verifies Tokens.
type TokenVerifier struct { type tokenVerifier struct {
Secret string secret string
}
var ErrEmptySecret = fmt.Errorf("secret is required")
func NewTokenVerifier(secret string) (*tokenVerifier, error) {
if secret == "" {
return nil, ErrEmptySecret
}
return &tokenVerifier{
secret: secret,
}, nil
} }
// Token contains everything to authenticate a user. // Token contains everything to authenticate a user.
@ -28,7 +40,7 @@ const (
) )
// CreateToken creates a new token from username and name. // CreateToken creates a new token from username and name.
func (tv *TokenVerifier) CreateToken(user *postgres.User) (string, error) { func (tv *tokenVerifier) CreateToken(user *postgres.User) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
"usr": user.Email, "usr": user.Email,
"name": user.Name, "name": user.Name,
@ -37,7 +49,7 @@ func (tv *TokenVerifier) CreateToken(user *postgres.User) (string, error) {
}) })
// Generate encoded token and send it as response. // Generate encoded token and send it as response.
t, err := token.SignedString([]byte(tv.Secret)) t, err := token.SignedString([]byte(tv.secret))
if err != nil { if err != nil {
return "", fmt.Errorf("create token: %w", err) return "", fmt.Errorf("create token: %w", err)
} }
@ -52,12 +64,12 @@ var (
) )
// VerifyToken verifys a given string-token. // VerifyToken verifys a given string-token.
func (tv *TokenVerifier) VerifyToken(tokenString string) (budgeteer.Token, error) { //nolint:ireturn func (tv *tokenVerifier) VerifyToken(tokenString string) (budgeteer.Token, error) { //nolint:ireturn
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("method '%v': %w", token.Header["alg"], ErrUnexpectedSigningMethod) return nil, fmt.Errorf("method '%v': %w", token.Header["alg"], ErrUnexpectedSigningMethod)
} }
return []byte(tv.Secret), nil return []byte(tv.secret), nil
}) })
if err != nil { if err != nil {
return nil, fmt.Errorf("parse jwt: %w", err) return nil, fmt.Errorf("parse jwt: %w", err)