auth.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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, verrs := BindAndValid(c, &user)
  16. if !ok {
  17. c.JSON(http.StatusNotAcceptable, gin.H{
  18. "errors": verrs,
  19. })
  20. return
  21. }
  22. u, err := model.GetUser(user.Name)
  23. if err != nil {
  24. log.Println(err)
  25. c.JSON(http.StatusForbidden, gin.H{
  26. "message": "Incorrect name or password",
  27. })
  28. return
  29. }
  30. if err = bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(user.Password)); err != nil {
  31. c.JSON(http.StatusForbidden, gin.H{
  32. "message": "Incorrect name or password",
  33. })
  34. return
  35. }
  36. var token string
  37. token, err = model.GenerateJWT(u.Name)
  38. if err != nil {
  39. c.JSON(http.StatusInternalServerError, gin.H{
  40. "message": err.Error(),
  41. })
  42. return
  43. }
  44. c.JSON(http.StatusOK, gin.H{
  45. "message": "ok",
  46. "token": token,
  47. })
  48. }
  49. func Logout(c *gin.Context) {
  50. token := c.GetHeader("Authorization")
  51. if token != "" {
  52. err := model.DeleteToken(token)
  53. if err != nil {
  54. c.JSON(http.StatusInternalServerError, gin.H{
  55. "message": err.Error(),
  56. })
  57. return
  58. }
  59. }
  60. c.JSON(http.StatusNoContent, gin.H{})
  61. }