Аутентификация Bcrypt и авторизация JWT - PullRequest
0 голосов
/ 12 января 2020

У меня есть обработчик 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 без аутентификации (форма входа), поэтому я и спрашиваю.

1 Ответ

0 голосов
/ 12 января 2020

JWT - один из самых безопасных способов аутентификации HTTP-запросов. В потоке JWT сам токен содержит данные. Сервер расшифровывает токен только для аутентификации пользователя. Данные не хранятся на сервере.

токены JWT включены в заголовок HTTP авторизации как часть схемы аутентификации на предъявителя

токены JWT имеют цифровую подпись эмитента (сервер, выполняющий аутентификацию), они могут быть проверены без повторного общения с сервером

Следовательно, его необходимо создать после успешного входа в систему. В вашем случае, перед перенаправлением на страницу приветствия.

...