【问题标题】:Ktor Session Cookie AuthenticationKtor 会话 Cookie 身份验证
【发布时间】:2019-10-28 18:33:47
【问题描述】:

我想使用会话 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 Not authorized 或类似情况。

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

谢谢

【问题讨论】:

    标签: kotlin ktor


    【解决方案1】:

    更新:

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

    您当前代码的问题是您没有明确指定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 了解更多信息。

    【讨论】:

    • 嗯,那是什么:``` install(Authentication) { session { validate { session -> // TODO: 做实际的验证 null } } }`` ?
    • 酷。 challenge = SessionAuthChallenge.Unauthorized 成功了。谢谢
    • 我用 Ktor 的 1.3.2 尝试了这个,但没有成功,因为自去年以来挑战实施似乎发生了变化,有没有人看到任何身份验证挑战的最新实施示例?它的行为就像它仍然默认为忽略但不清楚如何在管道中设置它。
    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 2010-10-02
    • 2010-09-26
    • 2015-04-30
    • 2017-11-25
    相关资源
    最近更新 更多