view auth/token.go @ 129:ee5a3dd8e972

Forgot to check if a db connection is already close when closing idle db connections.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 28 Jun 2018 16:45:01 +0200
parents bb9120d28950
children 0c56c56a1c44
line wrap: on
line source

package auth

import (
	"time"

	"gemma.intevation.de/gemma/config"

	jwt "github.com/dgrijalva/jwt-go"
)

type Claims struct {
	jwt.StandardClaims

	User  string   `json:"user"`
	Roles []string `json:"roles"`
}

const maxTokenValid = time.Hour * 3

func NewToken(user string, roles []string) (string, error) {

	// Create the Claims
	claims := &Claims{
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: jwt.TimeFunc().Add(maxTokenValid).Unix(),
		},
		User:  user,
		Roles: roles,
	}

	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString(config.Config.JWTSignKey)
}

func TokenToClaims(token string) (*Claims, error) {
	claims := &Claims{}
	_, err := jwt.ParseWithClaims(token, claims,
		func(*jwt.Token) (interface{}, error) { return config.Config.JWTSignKey, nil })
	return claims, err
}

func GenerateToken(user, password string) (string, error) {
	roles, err := AllOtherRoles(user, password)
	if err != nil {
		return "", err
	}
	token, err := NewToken(user, roles)
	if err != nil {
		return "", err
	}
	ConnPool.Add(token, user, password)
	return token, nil
}