api_base.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package admin
  2. import (
  3. "fmt"
  4. "net/http"
  5. "time"
  6. "github.com/bjdgyc/anylink/base"
  7. "github.com/bjdgyc/anylink/pkg/utils"
  8. "github.com/gorilla/mux"
  9. "github.com/xlzd/gotp"
  10. )
  11. // Login 登陆接口
  12. func Login(w http.ResponseWriter, r *http.Request) {
  13. // TODO 调试信息输出
  14. // hd, _ := httputil.DumpRequest(r, true)
  15. // fmt.Println("DumpRequest: ", string(hd))
  16. _ = r.ParseForm()
  17. adminUser := r.PostFormValue("admin_user")
  18. adminPass := r.PostFormValue("admin_pass")
  19. // 启用otp验证
  20. if base.Cfg.AdminOtp != "" {
  21. pwd := adminPass
  22. pl := len(pwd)
  23. if pl < 6 {
  24. RespError(w, RespUserOrPassErr)
  25. base.Error(adminUser, "管理员otp错误")
  26. return
  27. }
  28. // 判断otp信息
  29. adminPass = pwd[:pl-6]
  30. otp := pwd[pl-6:]
  31. totp := gotp.NewDefaultTOTP(base.Cfg.AdminOtp)
  32. unix := time.Now().Unix()
  33. verify := totp.Verify(otp, int(unix))
  34. if !verify {
  35. RespError(w, RespUserOrPassErr)
  36. base.Error(adminUser, "管理员otp错误")
  37. return
  38. }
  39. }
  40. // 认证错误
  41. if !(adminUser == base.Cfg.AdminUser &&
  42. utils.PasswordVerify(adminPass, base.Cfg.AdminPass)) {
  43. RespError(w, RespUserOrPassErr)
  44. base.Error(adminUser, "管理员用户名或密码错误")
  45. return
  46. }
  47. // token有效期
  48. expiresAt := time.Now().Unix() + 3600*3
  49. jwtData := map[string]interface{}{"admin_user": adminUser}
  50. tokenString, err := SetJwtData(jwtData, expiresAt)
  51. if err != nil {
  52. RespError(w, 1, err)
  53. return
  54. }
  55. data := make(map[string]interface{})
  56. data["token"] = tokenString
  57. data["admin_user"] = adminUser
  58. data["expires_at"] = expiresAt
  59. RespSucess(w, data)
  60. }
  61. func authMiddleware(next http.Handler) http.Handler {
  62. fn := func(w http.ResponseWriter, r *http.Request) {
  63. w.Header().Set("Access-Control-Allow-Origin", "*")
  64. w.Header().Set("Access-Control-Allow-Methods", "GET,POST,OPTIONS")
  65. w.Header().Set("Access-Control-Allow-Headers", "*")
  66. if r.Method == http.MethodOptions {
  67. return
  68. }
  69. route := mux.CurrentRoute(r)
  70. name := route.GetName()
  71. // fmt.Println("bb", r.URL.Path, name)
  72. if utils.InArrStr([]string{"login", "index", "static", "debug"}, name) {
  73. // 不进行鉴权
  74. next.ServeHTTP(w, r)
  75. return
  76. }
  77. // 进行登陆鉴权
  78. jwtToken := r.Header.Get("Jwt")
  79. if jwtToken == "" {
  80. jwtToken = r.FormValue("jwt")
  81. }
  82. data, err := GetJwtData(jwtToken)
  83. if err != nil || base.Cfg.AdminUser != fmt.Sprint(data["admin_user"]) {
  84. w.WriteHeader(http.StatusUnauthorized)
  85. return
  86. }
  87. next.ServeHTTP(w, r)
  88. }
  89. return http.HandlerFunc(fn)
  90. }