All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.http4k.security.OAuthCallback.kt Maven / Gradle / Ivy

package org.http4k.security

import org.http4k.core.HttpHandler
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status.Companion.TEMPORARY_REDIRECT
import org.http4k.core.toParameters
import org.http4k.security.openid.IdToken
import org.http4k.security.openid.IdTokenConsumer

class OAuthCallback(
    private val oAuthPersistence: OAuthPersistence,
    private val idTokenConsumer: IdTokenConsumer,
    private val accessTokenFetcher: AccessTokenFetcher
) : HttpHandler {

    override fun invoke(request: Request) = request.query("code")
        ?.let { code ->
            val state = request.query("state")?.toParameters() ?: emptyList()
            state.find { it.first == "csrf" }?.second
                ?.let(::CrossSiteRequestForgeryToken)
                ?.takeIf { it == oAuthPersistence.retrieveCsrf(request) }
                ?.let {
                    request.query("id_token")?.let { idTokenConsumer.consumeFromAuthorizationResponse(IdToken(it)) }
                    accessTokenFetcher.fetch(code)
                        ?.let { tokenDetails ->
                            tokenDetails.idToken?.also(idTokenConsumer::consumeFromAccessTokenResponse)

                            val originalUri = state.find { it.first == "uri" }?.second ?: "/"
                            oAuthPersistence.assignToken(request, Response(TEMPORARY_REDIRECT)
                                .header("Location", originalUri), tokenDetails.accessToken)
                        }
                }
        }
        ?: oAuthPersistence.authFailureResponse()
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy