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.Unauthorized
或 SessionAuthChallenge.Redirect
因此您的代码应如下所示:
install(Authentication) {
session<AuthSession> {
challenge = SessionAuthChallenge.Unauthorized
validate { session ->
// TODO: do the actual validation
null
}
}
}
旧:
您没有指定要使用的身份验证类型,可能是 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
}
}
}
查看 official documentation 了解更多信息。
我想使用会话 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.Unauthorized
或 SessionAuthChallenge.Redirect
因此您的代码应如下所示:
install(Authentication) {
session<AuthSession> {
challenge = SessionAuthChallenge.Unauthorized
validate { session ->
// TODO: do the actual validation
null
}
}
}
旧:
您没有指定要使用的身份验证类型,可能是 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
}
}
}
查看 official documentation 了解更多信息。