The backend for the project formerly known as signet, now known as beignet.
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package endpoints
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "time"
  6. "github.com/golang-jwt/jwt/v4"
  7. "github.com/imosed/signet/auth"
  8. . "github.com/imosed/signet/data"
  9. "github.com/rs/zerolog/log"
  10. "github.com/spf13/viper"
  11. )
  12. type LoginResponse struct {
  13. Token *string `json:"token"`
  14. }
  15. func Login(w http.ResponseWriter, r *http.Request) {
  16. var req AuthenticationRequest
  17. err := json.NewDecoder(r.Body).Decode(&req)
  18. if err != nil {
  19. log.Error().Err(err).Msg("Failed to decode body in login attempt")
  20. return
  21. }
  22. var userData struct {
  23. ID uint
  24. Password string
  25. Privileges uint
  26. }
  27. var resp LoginResponse
  28. Db.Table("users").Select("id, password, privileges").
  29. Where("username = ?", req.Username).First(&userData)
  30. var passwordMatches bool
  31. passwordMatches, err = ComparePasswordAndHash(req.Password, userData.Password)
  32. if err != nil {
  33. log.Error().Err(err).Msg("Could not compare password to hash in login attempt")
  34. return
  35. }
  36. if !passwordMatches {
  37. resp.Token = nil
  38. err = json.NewEncoder(w).Encode(resp)
  39. if err != nil {
  40. log.Error().Err(err).Msg("Failed to deliver failed login attempt response")
  41. }
  42. return
  43. }
  44. token := jwt.NewWithClaims(jwt.SigningMethodHS256, &auth.Claims{
  45. Username: req.Username,
  46. Privileges: userData.Privileges,
  47. RegisteredClaims: jwt.RegisteredClaims{
  48. ExpiresAt: jwt.NewNumericDate(time.Now().Add(10 * time.Hour)),
  49. },
  50. })
  51. secret := viper.GetString("app.secretKey")
  52. tokenString, err := token.SignedString([]byte(secret))
  53. if err != nil {
  54. log.Error().Err(err).Msg("Could not generate JWT token")
  55. return
  56. }
  57. resp.Token = &tokenString
  58. err = json.NewEncoder(w).Encode(resp)
  59. if err != nil {
  60. log.Error().Err(err).Msg("Could not deliver response in Login call")
  61. }
  62. }