auth.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package api
  2. import (
  3. "github.com/0xJacky/Nginx-UI/server/model"
  4. "github.com/gin-gonic/gin"
  5. "golang.org/x/crypto/bcrypt"
  6. "log"
  7. "net/http"
  8. )
  9. type LoginUser struct {
  10. Name string `json:"name" binding:"required,max=255"`
  11. Password string `json:"password" binding:"required,max=255"`
  12. }
  13. func Login(c *gin.Context) {
  14. var user LoginUser
  15. ok := BindAndValid(c, &user)
  16. if !ok {
  17. return
  18. }
  19. u, err := model.GetUser(user.Name)
  20. if err != nil {
  21. log.Println(err)
  22. c.JSON(http.StatusForbidden, gin.H{
  23. "message": "Incorrect name or password",
  24. })
  25. return
  26. }
  27. if err = bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(user.Password)); err != nil {
  28. c.JSON(http.StatusForbidden, gin.H{
  29. "message": "Incorrect name or password",
  30. })
  31. return
  32. }
  33. var token string
  34. token, err = model.GenerateJWT(u.Name)
  35. if err != nil {
  36. c.JSON(http.StatusInternalServerError, gin.H{
  37. "message": err.Error(),
  38. })
  39. return
  40. }
  41. c.JSON(http.StatusOK, gin.H{
  42. "message": "ok",
  43. "token": token,
  44. })
  45. }
  46. func Logout(c *gin.Context) {
  47. token := c.GetHeader("Authorization")
  48. if token != "" {
  49. err := model.DeleteToken(token)
  50. if err != nil {
  51. c.JSON(http.StatusInternalServerError, gin.H{
  52. "message": err.Error(),
  53. })
  54. return
  55. }
  56. }
  57. c.JSON(http.StatusNoContent, gin.H{})
  58. }