api/pkg/routes/api/v1/login.go

71 lines
1.6 KiB
Go
Raw Normal View History

2018-06-10 09:34:59 +00:00
package v1
2018-06-10 09:11:41 +00:00
import (
2018-10-31 12:42:38 +00:00
"code.vikunja.io/api/pkg/models"
"code.vikunja.io/api/pkg/routes/crud"
2018-06-10 09:11:41 +00:00
"crypto/md5"
"encoding/hex"
"github.com/dgrijalva/jwt-go"
"github.com/labstack/echo"
"github.com/spf13/viper"
2018-06-10 09:11:41 +00:00
"net/http"
"time"
)
// Login is the login handler
func Login(c echo.Context) error {
2018-06-13 11:45:22 +00:00
// swagger:operation POST /login user login
// ---
// summary: Logs a user in. Returns a JWT-Token to authenticate requests
// consumes:
// - application/json
// produces:
// - application/json
// parameters:
// - name: body
// in: body
// schema:
// "$ref": "#/definitions/UserLogin"
// responses:
// "200":
// "$ref": "#/responses/Token"
// "400":
// "$ref": "#/responses/Message"
// "403":
// "$ref": "#/responses/Message"
2018-07-10 22:28:53 +00:00
u := models.UserLogin{}
if err := c.Bind(&u); err != nil {
2018-06-10 09:11:41 +00:00
return c.JSON(http.StatusBadRequest, models.Message{"Please provide a username and password."})
}
// Check user
2018-07-10 22:28:53 +00:00
user, err := models.CheckUserCredentials(&u)
2018-06-10 09:11:41 +00:00
if err != nil {
return crud.HandleHTTPError(err)
2018-06-10 09:11:41 +00:00
}
// Create token
token := jwt.New(jwt.SigningMethodHS256)
// Set claims
claims := token.Claims.(jwt.MapClaims)
claims["username"] = user.Username
claims["email"] = user.Email
claims["id"] = user.ID
claims["exp"] = time.Now().Add(time.Hour * 72).Unix()
avatar := md5.Sum([]byte(user.Email))
claims["avatar"] = hex.EncodeToString(avatar[:])
// Generate encoded token and send it as response.
t, err := token.SignedString([]byte(viper.GetString("service.JWTSecret")))
2018-06-10 09:11:41 +00:00
if err != nil {
return err
}
return c.JSON(http.StatusOK, map[string]string{
"token": t,
})
}