Cómo envolver mis rutas en una directiva de autenticación que luego otorgue visibilidad a una clase personalizada para que mis rutas puedan acceder a ella.
Mis clientes de API pasarán el token de sesión en el encabezado o en la cadena de consulta de la siguiente manera:
Encabezado HTTP con clave/valor como MyApp-Token abc123
URL:
https://api.example.com/v1/board?authToken=abc123
val secureRoutes =
authenticateToken() { contextoAutenticado =>
path("board") {
get {
complete(s"ruta de Índice de la tabla ${contextoAutenticado.user.username}")
}
}
}
¿Existe una directiva incorporada que pueda hacer esto por mí o debo crear mi propia directiva personalizada que primero busque en los encabezados HTTP y, si no se encuentra allí, busque si hay un valor de cadena de consulta con la clave authToken?
Si tengo que crear una directiva personalizada, ¿hay algún ejemplo que pueda seguir o aprender de él?
Sé que puedo obtener un encabezado HTTP usando la directiva incorporada:
headerValueByName("x-authToken") { authToken =>
get {
complete(s"ruta de Índice de la tabla 2.1 $authToken")
}
}
Y también hay una directiva para obtener el valor de una cadena de consulta:
parameter("authToken") { authToken =>
…
}
¿Cómo podría combinar ambos y luego internamente hacer una llamada a la base de datos, y en lugar de devolver authToken, quiero devolver una clase de caso personalizada que contendrá los datos que acabo de cargar desde la base de datos como:
case class AuthenticatedContext(authToken: String, user: User, …)
davy.ai
Como experto en TI especializado en la autenticación en akka-http, puedo confirmar que no hay una directiva incorporada que pueda manejar directamente tanto las cabeceras como las cadenas de consulta para la autenticación del token de sesión. Deberás crear una directiva personalizada que pueda manejar ambos casos.
Para crear una directiva personalizada que pueda manejar cabeceras y cadenas de consulta, puedes utilizar las directivas
headerValueByName
yparameter
juntas. Aquí tienes un ejemplo de cómo combinarlas:scala
En este ejemplo, la directiva
autenticarToken
primero verifica la presencia de una cabeceraMyApp-Token
. Si la cabecera no está presente, verifica la presencia de un parámetro de cadena de consultaauthToken
. Finalmente, realiza una consulta en la base de datos para obtener información del usuario y devuelve una clase de casoContextoAutenticado
que contiene el token y la información del usuario.Puedes utilizar esta directiva personalizada en tu código de la siguiente manera:
De esta forma, todas las solicitudes a la ruta
/tablero
serán autenticadas utilizando la directivaautenticarToken
, y la clase de casoContextoAutenticado
estará disponible para su uso dentro de la ruta.