Как авторизовать загрузку POST-формы в Ktor? - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу создать простую форму, в которой пользователь вводит некоторую строку (ключ, который разрешает ему загрузить файл) и файл, который он хочет загрузить (без ограничения размера, может быть даже 10 ГБ или более).

У меня проблема в том, что я не знаю, как проверить код ДО принятия файла.

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

            var isAuth = false
            multipart.forEachPart { part ->
                when (part) {
                    is PartData.FormItem -> {
                        val name = part.name
                        if(name != null && name == "key")
                            isAuth = isKeyValid(part.value)
                    }
                    is PartData.FileItem -> {
                        if(!isAuth) {
                            call.respond("Request not authorized")
                            call.response.status(HttpStatusCode.Forbidden)
                            part.dispose
                            return@forEachPart
                        }
                        if(part.originalFileName.isNullOrEmpty() || part.originalFileName!!.isBlank()) {
                            call.respond("Illegal filename")
                            call.response.status(HttpStatusCode.BadRequest)
                            return@forEachPart
                        }
                        val targetDir = File(uploadDir.path + File.separator + randomId)
                        targetDir.mkdir()
                        val targetFile = File(targetDir.path + File.separator + part.originalFileName)
                        targetFile.createNewFile()
                        sb.append(randomId)
                        sb.append("/")
                        sb.append(part.originalFileName)
                        sb.append("\n")
                        part.streamProvider().use { input -> targetFile.outputStream().buffered().use { output -> input.copyToSuspend(output) } }
                    }
                }
                part.dispose
            }

HTML форма, которую я использую:

<html>
<body>
<form action="/upload" method="POST" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="text" name="key">

    <input type="submit" value="upload" name="submit">
</form>
</body>
</html>

1 Ответ

0 голосов
/ 07 апреля 2020
  1. Добавить функцию аутентификации
implementation "io.ktor:ktor-auth:$ktor_version"
Установка функции
install(Authentication) { //set type of authenction here }
  1. Завершение вызова в authenticate {} блок
authenticate("auth") {
  post(FORM) {
  }
}

Подробнее: Аутентификация Ktor

...