tutorial implementar funciona ejemplo como scala rest authentication playframework http-token-authentication

scala - implementar - Autenticación basada en tokens usando Play 2 Framework



oauth2 token (2)

Creo que deberías echarle un vistazo al enfoque de James Ward aquí .

El enfoque en resumen es bastante sencillo:

  1. El usuario solicita la página de índice y carga su aplicación de una sola página
  2. La aplicación intenta averiguar si hay un token de seguridad almacenado en las cookies del navegador (o puede usar localStorage)
  3. Si no hay un token, se muestra la página de inicio de sesión
  4. Si token está presente, creemos que ya estamos autenticados
  5. La aplicación intenta recuperar algunos datos del servidor mediante token en un encabezado personalizado (como X-AUTH-TOKEN)
  6. El servidor valida el token y responde con datos si todo está bien
  7. Si el token no es válido, el servidor responde con 401, luego continúe desde el paso 3
  8. Cada solicitud a su servidor usa el mismo token

Si desea profundizar en los detalles, ¡siéntase libre de hacer más preguntas!

Estoy construyendo una aplicación usando Play Framework 2, en Scala. Será completamente RESTful, con llamadas realizadas en este momento desde una aplicación de una sola página de JavaScript.

¿Cuál sería la mejor forma de integrar la autenticación basada en tokens? Existen múltiples bibliotecas de autenticación para Play2, además del rasgo Secured bruto, pero no está claro cuál sería el más conveniente.

Gracias por su ayuda y sus sugerencias


En caso de que se refiera a JWT cuando diga "basado en token", le recomendamos que consulte este ejemplo de implementación de Autenticación básica HTTP en Play2, y esta respuesta a: cómo implementar JWT en un backend de Scala. Lo bueno es que no necesita cookies, ni un caché para usuarios autenticados.

Incluye contenido del primer enlace para mayor comodidad:

def Secured[A](username: String, password: String)(action: Action[A]) = Action(action.parser) { request => request.headers.get("Authorization").flatMap { authorization => authorization.split(" ").drop(1).headOption.filter { encoded => new String(org.apache.commons.codec.binary.Base64.decodeBase64(encoded.getBytes)).split(":").toList match { case u :: p :: Nil if u == username && password == p => true case _ => false } }.map(_ => action(request)) }.getOrElse { Unauthorized.withHeaders("WWW-Authenticate" -> """Basic realm="Secured"""") } }

Use de la siguiente manera:

def myAction = Secured("admin", "1234secret") { Action { request => Ok } }