api_login.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package api
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/torkelo/grafana-pro/pkg/models"
  5. log "github.com/alecthomas/log4go"
  6. )
  7. func init() {
  8. addRoutes(func(self *HttpServer) {
  9. self.router.GET("/login", self.index)
  10. self.router.POST("/login", self.loginPost)
  11. self.router.POST("/logout", self.logoutPost)
  12. })
  13. }
  14. type loginJsonModel struct {
  15. Email string `json:"email" binding:"required"`
  16. Password string `json:"password" binding:"required"`
  17. Remember bool `json:"remember"`
  18. }
  19. func (self *HttpServer) loginPost(c *gin.Context) {
  20. var loginModel loginJsonModel
  21. if !c.EnsureBody(&loginModel) {
  22. c.JSON(400, gin.H{"status": "bad request"})
  23. return
  24. }
  25. account, err := self.store.GetAccountByLogin(loginModel.Email)
  26. if err != nil {
  27. c.JSON(400, gin.H{"status": err.Error()})
  28. return
  29. }
  30. if loginModel.Password != account.Password {
  31. c.JSON(401, gin.H{"status": "unauthorized"})
  32. return
  33. }
  34. loginUserWithAccount(account, c)
  35. var resp = &LoginResultDto{}
  36. resp.Status = "Logged in"
  37. resp.User.Login = account.Login
  38. c.JSON(200, resp)
  39. }
  40. func loginUserWithAccount(account *models.Account, c *gin.Context) {
  41. if account == nil {
  42. log.Error("Account login with nil account")
  43. }
  44. session, err := sessionStore.Get(c.Request, "grafana-session")
  45. if err != nil {
  46. log.Error("Failed to get session %v", err)
  47. }
  48. session.Values["accountId"] = account.Id
  49. session.Save(c.Request, c.Writer)
  50. }
  51. func (self *HttpServer) logoutPost(c *gin.Context) {
  52. session, _ := sessionStore.Get(c.Request, "grafana-session")
  53. session.Values = nil
  54. session.Save(c.Request, c.Writer)
  55. c.JSON(200, gin.H{"status": "logged out"})
  56. }