Merge branch 'adminUserTokens' into 'master'

Allow admins to generate a user token

See merge request !96
This commit is contained in:
Lucas 2018-05-03 12:10:38 +00:00
commit 882e7e8ade
4 changed files with 54 additions and 16 deletions

View File

@ -9,6 +9,7 @@ import (
"gitlab.quimbo.fr/odwrtw/canape/backend/users" "gitlab.quimbo.fr/odwrtw/canape/backend/users"
"gitlab.quimbo.fr/odwrtw/canape/backend/web" "gitlab.quimbo.fr/odwrtw/canape/backend/web"
"github.com/gorilla/mux"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -28,6 +29,34 @@ func GetUsersHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error
return env.RenderJSON(w, users) return env.RenderJSON(w, users)
} }
// GenerateUserToken generates a user token
func GenerateUserToken(env *web.Env, w http.ResponseWriter, r *http.Request) error {
log := env.Log.WithFields(logrus.Fields{
"function": "admin.GenerateUserToken",
})
log.Debug("Generating user token")
vars := mux.Vars(r)
username := vars["username"]
user, err := users.Get(env.Database, username)
if err != nil {
return err
}
t, err := env.Auth.GenerateJWTToken(r, user)
if err != nil {
return err
}
t.Description = "generated token for polochon"
if err := t.Add(env.Database); err != nil {
return err
}
return env.RenderJSON(w, t)
}
// UpdateUserHandler updates the user data // UpdateUserHandler updates the user data
func UpdateUserHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error { func UpdateUserHandler(env *web.Env, w http.ResponseWriter, r *http.Request) error {
log := env.Log.WithFields(logrus.Fields{ log := env.Log.WithFields(logrus.Fields{

View File

@ -70,19 +70,8 @@ func (a *Authorizer) GenHash(password string) (string, error) {
return string(b), nil return string(b), nil
} }
// Login cheks password and creates a jwt token // GenerateJWTToken generates a JWT token for a user
func (a *Authorizer) Login(r *http.Request, username, password string) (*tokens.Token, error) { func (a *Authorizer) GenerateJWTToken(r *http.Request, u User) (*tokens.Token, error) {
u, err := a.Backend.GetUser(username)
if err != nil {
return nil, err
}
// Compare the password
err = bcrypt.CompareHashAndPassword([]byte(u.GetHash()), []byte(password+a.Pepper))
if err != nil {
return nil, ErrInvalidPassword
}
// Create a jwt token // Create a jwt token
jwtToken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ jwtToken := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
// Not before // Not before
@ -101,10 +90,29 @@ func (a *Authorizer) Login(r *http.Request, username, password string) (*tokens.
return nil, err return nil, err
} }
t := &tokens.Token{ return &tokens.Token{
Token: ss, Token: ss,
Username: u.GetName(), Username: u.GetName(),
IP: getIPFromRequest(r), IP: getIPFromRequest(r),
}, nil
}
// Login cheks password and creates a jwt token
func (a *Authorizer) Login(r *http.Request, username, password string) (*tokens.Token, error) {
u, err := a.Backend.GetUser(username)
if err != nil {
return nil, err
}
// Compare the password
err = bcrypt.CompareHashAndPassword([]byte(u.GetHash()), []byte(password+a.Pepper))
if err != nil {
return nil, ErrInvalidPassword
}
t, err := a.GenerateJWTToken(r, u)
if err != nil {
return nil, err
} }
if err := t.Add(a.db); err != nil { if err := t.Add(a.db); err != nil {

View File

@ -66,4 +66,5 @@ func setupRoutes(env *web.Env) {
env.Handle("/admins/users", admin.GetUsersHandler).WithRole(users.AdminRole).Methods("GET") env.Handle("/admins/users", admin.GetUsersHandler).WithRole(users.AdminRole).Methods("GET")
env.Handle("/admins/users", admin.UpdateUserHandler).WithRole(users.AdminRole).Methods("POST") env.Handle("/admins/users", admin.UpdateUserHandler).WithRole(users.AdminRole).Methods("POST")
env.Handle("/admins/stats", admin.GetStatsHandler).WithRole(users.AdminRole).Methods("GET") env.Handle("/admins/stats", admin.GetStatsHandler).WithRole(users.AdminRole).Methods("GET")
env.Handle("/admins/tokens/{username}", admin.GenerateUserToken).WithRole(users.AdminRole).Methods("POST")
} }

View File

@ -11,7 +11,7 @@ import (
) )
const ( const (
addTokenQuery = `INSERT INTO tokens (token, username, ip) VALUES ($1, $2, $3);` addTokenQuery = `INSERT INTO tokens (token, username, ip, description) VALUES ($1, $2, $3, $4);`
getTokenQuery = `SELECT * FROM tokens WHERE token=$1;` getTokenQuery = `SELECT * FROM tokens WHERE token=$1;`
getUserTokenQuery = `SELECT * FROM tokens WHERE username=$1 and token=$2;` getUserTokenQuery = `SELECT * FROM tokens WHERE username=$1 and token=$2;`
getUserTokensQuery = `SELECT * FROM tokens WHERE username=$1;` getUserTokensQuery = `SELECT * FROM tokens WHERE username=$1;`
@ -37,7 +37,7 @@ type Token struct {
// Add a token to the database // Add a token to the database
func (t *Token) Add(db *sqlx.DB) error { func (t *Token) Add(db *sqlx.DB) error {
_, err := db.Queryx(addTokenQuery, t.Token, t.Username, t.IP) _, err := db.Queryx(addTokenQuery, t.Token, t.Username, t.IP, t.Description)
if err != nil { if err != nil {
return err return err
} }