package main import ( "encoding/json" "net/http" "time" "github.com/bootdotdev/learn-file-storage-s3-golang-starter/internal/auth" "github.com/bootdotdev/learn-file-storage-s3-golang-starter/internal/database" ) func (cfg *apiConfig) handlerLogin(w http.ResponseWriter, r *http.Request) { type parameters struct { Password string `json:"password"` Email string `json:"email"` } type response struct { database.User Token string `json:"token"` RefreshToken string `json:"refresh_token"` } decoder := json.NewDecoder(r.Body) params := parameters{} err := decoder.Decode(¶ms) if err != nil { respondWithError(w, http.StatusInternalServerError, "Couldn't decode parameters", err) return } user, err := cfg.db.GetUserByEmail(params.Email) if err != nil { respondWithError(w, http.StatusUnauthorized, "Incorrect email or password", err) return } err = auth.CheckPasswordHash(params.Password, user.Password) if err != nil { respondWithError(w, http.StatusUnauthorized, "Incorrect email or password", err) return } accessToken, err := auth.MakeJWT( user.ID, cfg.jwtSecret, time.Hour*24*30, ) if err != nil { respondWithError(w, http.StatusInternalServerError, "Couldn't create access JWT", err) return } refreshToken, err := auth.MakeRefreshToken() if err != nil { respondWithError(w, http.StatusInternalServerError, "Couldn't create refresh token", err) return } _, err = cfg.db.CreateRefreshToken(database.CreateRefreshTokenParams{ UserID: user.ID, Token: refreshToken, ExpiresAt: time.Now().UTC().Add(time.Hour * 24 * 60), }) if err != nil { respondWithError(w, http.StatusInternalServerError, "Couldn't save refresh token", err) return } respondWithJSON(w, http.StatusOK, response{ User: user, Token: accessToken, RefreshToken: refreshToken, }) }