in ktor-features/ktor-auth/jvm/src/io/ktor/auth/Authentication.kt [89:140]
public fun interceptPipeline(
pipeline: ApplicationCallPipeline,
configurationNames: List<String?> = listOf(null),
optional: Boolean = false
) {
require(configurationNames.isNotEmpty()) { "At least one configuration name or default listOf(null)" }
val configurations = configurationNames.map { configurationName ->
config.providers.firstOrNull { it.name == configurationName }
?: throw IllegalArgumentException(
if (configurationName == null)
"Default authentication configuration was not found"
else
"Authentication configuration with the name $configurationName was not found"
)
}
val authenticationPipeline = when {
configurations.size == 1 -> configurations[0].pipeline
else -> AuthenticationPipeline().apply {
for (provider in configurations) {
merge(provider.pipeline)
}
}
}
pipeline.insertPhaseAfter(ApplicationCallPipeline.Features, AuthenticatePhase)
pipeline.insertPhaseAfter(AuthenticatePhase, ChallengePhase)
pipeline.intercept(AuthenticatePhase) {
val call = call
val authenticationContext = AuthenticationContext.from(call)
if (authenticationContext.principal != null) return@intercept
processAuthentication(call, authenticationContext, configurations, authenticationPipeline)
}
pipeline.intercept(ChallengePhase) {
val context = AuthenticationContext.from(call)
when {
context.principal != null -> {
}
context.challenge.completed -> finish()
else -> {
if (!optional || context.hasInvalidCredentials()) {
executeChallenges(context)
}
}
}
}
}