Не работает аутентификация на golang MySQL
Хотел создать регистрацию/авторизацию на сайте, регистрация уже работает, а вот код аутентификации почему то нет. Ожидаю переход на домашнюю страницу при правильности введенных данных(и вывод сообщения в обратном случае), а оно не переходит. Может я в целом не то делаю, может проблема в коде. Вот сам код:
func log(w http.ResponseWriter, r *http.Request) {
FormEmail := r.FormValue("email")
FormPassword := r.FormValue("password")
var email string
var password string
// подключение
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:8889)/service")
if err != nil {
panic(err)
}
defer db.Close()
// авторизация
res, err := db.Query(fmt.Sprintf("SELECT * FROM `users` WHERE `email` = '%s'", email))
result, error := db.Query(fmt.Sprintf("SELECT * FROM `users` WHERE `password` = '%s'", password))
if err != nil || error != nil {
panic(err)
}
posts = []User{}
for res.Next() {
var post User
err = res.Scan(&post.Id, &post.Name, &post.Surname, &post.Email, &post.Number, &post.Password)
if err != nil {
panic(err)
}
if post.Email != FormEmail {
fmt.Fprintf(w, "неправильная почта")
}
}
for result.Next() {
var post User
error = res.Scan(&post.Id, &post.Name, &post.Surname, &post.Email, &post.Number, &post.Password)
if error != nil {
panic(err)
}
if post.Password != FormPassword {
fmt.Fprintf(w, "неправильный пароль")
}
}
http.Redirect(w, r, "/", http.StatusSeeOther)
}
html:
<form action="/log" method="post">
<input type="email" name="email">
<input type="password" name="password">
<button>Войти</button>
</form>
Смысл таков: человек вводит email и пароль на форме, и нужно сверить с данными в БД. User-это структура созданная сверху, в которую присваиваются данные с полей таблицы. FormEmail и FormPassword это значения с полей формы, а email и password изначально пустые переменные типа с string. Ошибки не выводятся, к БД подключено правильно. Думаю я что то не то делаю, буду благодарен за каждую подсказку. Прошу прощения если вопрос глупый, я просто только учусь
Ответы (1 шт):
я немного упростил ваши проверки, добавил ответ запроса, так как нельзя падать паникой внутри приложения))
func log(w http.ResponseWriter, r *http.Request) {
FormEmail := r.FormValue("email")
FormPassword := r.FormValue("password")
// подключение
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:8889)/service")
if err != nil {
panic(err)
}
defer db.Close()
// проверяем есть ли пользователь с заданным email + password
res, err := db.Query("SELECT * FROM `users` WHERE `email` = '?' and password = '?'", FormEmail, FormPassword)
if err != nil {
fmt.Printf("%w", err)
JSONError(500, "DB100 error code example", "DB error", w)
return
}
// проверяем есть ли записи в БД.
if !res.Next() {
JSONError(413, "trololo", "user not found", w)
return
}
// если дошли сюда, значит все ок, значит можно пропустить его дальше
http.Redirect(w, r, "/", http.StatusSeeOther)
}
func JSONError(httpcode int, code, msg string, w http.ResponseWriter) {
type Error struct {
Code *string `json:"code,omitempty"`
Message *string `json:"message,omitempty"`
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("X-Content-Type-Options", "nosniff")
w.WriteHeader(httpcode)
json.NewEncoder(w).Encode(
Error{
Code: &code,
Message: &msg,
},
)
}