@@ -9,10 +9,11 @@ import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
99import io.ktor.http.ContentType
1010import io.ktor.http.HttpMethod
1111import io.ktor.http.HttpStatusCode
12+ import io.ktor.http.encodedPath
13+ import io.ktor.resources.Resource
1214import io.ktor.serialization.jackson.jackson
1315import io.ktor.server.application.Application
1416import io.ktor.server.application.ApplicationCall
15- import io.ktor.server.application.call
1617import io.ktor.server.application.install
1718import io.ktor.server.auth.Authentication
1819import io.ktor.server.auth.OAuthAccessTokenResponse
@@ -21,17 +22,16 @@ import io.ktor.server.auth.authenticate
2122import io.ktor.server.auth.authentication
2223import io.ktor.server.auth.oauth
2324import io.ktor.server.engine.embeddedServer
24- import io.ktor.server.locations.KtorExperimentalLocationsAPI
25- import io.ktor.server.locations.Location
26- import io.ktor.server.locations.Locations
27- import io.ktor.server.locations.location
28- import io.ktor.server.locations.locations
29- import io.ktor.server.locations.url
3025import io.ktor.server.netty.Netty
26+ import io.ktor.server.resources.Resources
27+ import io.ktor.server.resources.href
28+ import io.ktor.server.resources.resource
3129import io.ktor.server.response.respondText
3230import io.ktor.server.routing.get
3331import io.ktor.server.routing.param
3432import io.ktor.server.routing.routing
33+ import io.ktor.server.util.url
34+ import kotlinx.serialization.Serializable
3535
3636fun main () {
3737 embeddedServer(Netty , port = 8080 ) {
@@ -54,19 +54,21 @@ fun main() {
5454 }.start(true )
5555}
5656
57- @OptIn(KtorExperimentalLocationsAPI ::class )
5857fun Application.module (authConfig : AuthConfig ) {
5958 val idProviders = authConfig.providers.map { it.settings }.associateBy { it.name }
6059
61- install(Locations )
60+ install(Resources )
6261 install(Authentication ) {
6362 oauth(" oauth2" ) {
6463 client = httpClient
6564 providerLookup = {
66- idProviders[application.locations.resolve<Login >(Login ::class , this ).type] ? : idProviders.values.first()
65+ val t = this .parameters[" type" ].orEmpty()
66+ idProviders[t] ? : idProviders.values.first()
6767 }
6868 urlProvider = {
69- url(Login (it.name))
69+ url {
70+ encodedPath = application.href(Login (it.name))
71+ }
7072 }
7173 }
7274 }
@@ -76,26 +78,32 @@ fun Application.module(authConfig: AuthConfig) {
7678 get {
7779 call.respondText(" nothing to see here really" )
7880 }
79- location<Login > {
81+ resource<Login > {
82+ // /login/{type}?error=...
8083 param(" error" ) {
81- handle {
82- call.respondText(ContentType .Text .Html , HttpStatusCode .BadRequest ) {
84+ get {
85+ call.respondText(
86+ ContentType .Text .Html ,
87+ HttpStatusCode .BadRequest
88+ ) {
8389 " received error on login: ${call.parameters.getAll(" error" ).orEmpty()} "
8490 }
8591 }
8692 }
87- handle {
93+ // /login/{type}
94+ get {
8895 call.respondText(" welcome ${call.subject()} " )
8996 }
9097 }
98+
9199 }
92100 }
93101}
94102
95- @Location( " /login/{type?} " )
96- @OptIn( KtorExperimentalLocationsAPI :: class )
103+ @Serializable
104+ @Resource( " /login/{type?} " )
97105class Login (
98- val type : String = " " ,
106+ val type : String? = " " ,
99107)
100108
101109class AuthConfig (
0 commit comments