es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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, …)

Tags:  ,

Answer

  1. Avatar for 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 y parameter juntas. Aquí tienes un ejemplo de cómo combinarlas:

    scala

    def autenticarToken(): Directive1[ContextoAutenticado] = {
      headerValueByName("MyApp-Token").orElse(parameter("authToken")).flatMap { token =>
        // realizar consulta en la base de datos y devolver contexto autenticado
        val usuario = buscarUsuario(token)
        provide(ContextoAutenticado(token, usuario))
      }
    }
    

    En este ejemplo, la directiva autenticarToken primero verifica la presencia de una cabecera MyApp-Token. Si la cabecera no está presente, verifica la presencia de un parámetro de cadena de consulta authToken. Finalmente, realiza una consulta en la base de datos para obtener información del usuario y devuelve una clase de caso ContextoAutenticado que contiene el token y la información del usuario.

    Puedes utilizar esta directiva personalizada en tu código de la siguiente manera:

    val rutasSeguras = autenticarToken() { contextoAutenticado =>
      path("tablero") {
        get {
          complete(s"ruta de índice del tablero ${contextoAutenticado.usuario.nombreUsuario}")
        }
      }
    }
    

    De esta forma, todas las solicitudes a la ruta /tablero serán autenticadas utilizando la directiva autenticarToken, y la clase de caso ContextoAutenticado estará disponible para su uso dentro de la ruta.

Comments are closed.