Ktor Session Cookie аутентификация - PullRequest
1 голос
/ 14 июня 2019

Я хотел бы использовать сессионный cookie для аутентификации с помощью Ktor, и сейчас у меня есть:

private const val SEVER_PORT = 8082
private const val SESSION_COOKIE_NAME = "some-cookie-name"

data class AuthSession(
    val authToken: String
)

fun main() {
    embeddedServer(Netty, port = SEVER_PORT, module = Application::basicAuthApplication).start(wait = true)
}

fun Application.basicAuthApplication() {
    install(Sessions) {
        cookie<AuthSession>(SESSION_COOKIE_NAME, SessionStorageMemory()) {
            cookie.path = "/"
        }
    }
    install(DefaultHeaders)
    install(CallLogging)
    install(Authentication) {
        session<AuthSession> {
            validate { session ->
                // TODO: do the actual validation
                null
            }
        }
    }

    routing {
        authenticate {
            get("/") {
                call.respondText("Success")
            }
        }
    }
}

Но каждый раз, когда я делаю:

curl -v localhost:8082

Я получаю HTTP 200 и ответ «Успех»

Я ожидал получить HTTP 401 Не авторизован или что-то подобное.

Может кто-нибудь подсказать мне, как правильно выполнять аутентификацию сессионных файлов cookie с помощью Ktor?

спасибо

1 Ответ

2 голосов
/ 15 июня 2019

ОБНОВЛЕНИЕ:

Хорошо, я понял, что существует тип аутентификации session, который не задокументирован в документах по функциям аутентификации.

Проблема с вашим текущим кодомчто вы не указываете challenge в явном виде, заданный по умолчанию вызов по умолчанию - SessionAuthChallenge.Ignore, поэтому вы должны изменить его на SessionAuthChallenge.Unauthorized или SessionAuthChallenge.Redirect

Таким образом, ваш код должен выглядеть следующим образом:

install(Authentication) {
    session<AuthSession> {
        challenge = SessionAuthChallenge.Unauthorized
        validate { session ->
            // TODO: do the actual validation
            null
        }
    }
}

OLD:

Вы не указываете тип аутентификации, который хотите использовать, вероятно, basic, form или jwt, возможно, вы захотитепопробуйте что-нибудь подобное для аутентификации формы, например:

install(Authentication) {
    form("login") {

        skipWhen { call -> call.sessions.get<AuthSession>() != null }

        userParamName = "username"
        passwordParamName = "password"
        challenge = FormAuthChallenge.Unauthorized
        validate { credentials ->
         // Handle credentials validations
       }
    }
}

Для получения дополнительной информации обратитесь к официальной документации .

...