У меня есть обработчик GET /login
, который отображает форму с запросом имени пользователя и пароля.
type Credentials struct {
Username string `json:"username"`
Password string `json:"password"`
}
func login(w http.ResponseWriter, req *http.Request) {
creds := &Credentials{}
creds.Username = req.FormValue("username")
creds.Password = req.FormValue("password")
result := config.Db.QueryRow("SELECT password FROM users WHERE username=$1", creds.Username)
storedCreds := &Credentials{}
err := result.Scan(&storedCreds.Password)
if err != nil {
if err == sql.ErrNoRows {
// No such row. Return to login form
http.Redirect(w, req, "/login", http.StatusSeeOther)
return
}
fmt.Println("internal error")
return
}
err = bcrypt.CompareHashAndPassword([]byte(storedCreds.Password), []byte(creds.Password))
if err != nil {
// wrong password - return to login form
http.Redirect(w, req, "/login", http.StatusSeeOther)
return
}
// username and password match. Redirect to /welcome.
http.Redirect(w, req, "/welcome", http.StatusSeeOther)
}
Для авторизации я использую JWT (JSON Web Tokens), поэтому на сервер, но токен должен быть создан и сохранен на компьютере пользователя в файле Cook ie. Мне было интересно, когда я должен начать создавать повара ie, в котором хранится токен? Сразу после успешного входа? Это нормально?
err = bcrypt.CompareHashAndPassword([]byte(storedCreds.Password), []byte(creds.Password))
if err != nil {
// wrong password - return to login form
http.Redirect(w, req, "/login", http.StatusSeeOther)
return
}
// Should I create the cookie/token here?
// username and password match. Redirect to /welcome.
http.Redirect(w, req, "/welcome", http.StatusSeeOther)
}
В большинстве примеров, которые я видел в Интернете, описывается процесс авторизации JWT без аутентификации (форма входа), поэтому я и спрашиваю.