Ktor 会话 Cookie 认证

Ktor Session Cookie Authentication

我想使用会话 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 和响应 "Success"

我希望得到一个 HTTP 401 未授权或类似的东西。

有人可以告诉我如何使用 Ktor 进行正确的会话 cookie 身份验证吗?

谢谢

更新:

好的,我意识到有一个 session 身份验证类型,它没有记录在身份验证功能文档中。

您当前代码的问题是您没有明确指定 challenge,内部指定的默认挑战是 SessionAuthChallenge.Ignore,因此您必须将其更改为 SessionAuthChallenge.UnauthorizedSessionAuthChallenge.Redirect

因此您的代码应如下所示:

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

旧:

您没有指定要使用的身份验证类型,可能是 basicformjwt,例如您可能想尝试这样的表单身份验证:

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

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

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

查看 official documentation 了解更多信息。