Skip to content

Instantly share code, notes, and snippets.

@rogerforner
Last active January 7, 2022 11:49
Show Gist options
  • Save rogerforner/9482da453e313730835b125db6b513e6 to your computer and use it in GitHub Desktop.
Save rogerforner/9482da453e313730835b125db6b513e6 to your computer and use it in GitHub Desktop.
AdonisJS Login (JWT): Autenticar usuario/ria por nombre de usuario, email, etc.

Login (username, email, ...)

Me han funcionado dos opciones.

LoginController.js

Pasos:

  • Declaramos una variable con la que validar, a través de Regex, el email, el número de teléfono, etc..
  • Utilizamos el condicional if para realizar la búsqueda del usuario según el dato uid introducido.

Ejemplo:

let regexEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/

if (regexEmail.test(formData.uid)) {
  user = await User.findByOrFail('email', formData.uid)
} else {
  user = await User.findByOrFail('username', formData.uid)
}

LoginController2.js

Pasos:

  • Hacemos uso de Lucid y las consultas where() y orWhere(). Obtenemos una colección.
"user": [
  {
    "id": 9,
    "username": "roger",
    "email": "roger@example.com",
    "phone": null,
    "birthdate": "1987-02-25 00:00:00",
    "name": null,
    "is_verified": 1,
    "created_at": "2019-05-16 10:43:34",
    "updated_at": "2019-05-16 11:03:06"
  }
],
  • Obtener el primer objeto .first() de la colección para poder utilizarlo con auth.
"user": {
  "id": 9,
  "username": "roger",
  "email": "roger@example.com",
  "phone": null,
  "birthdate": "1987-02-25 00:00:00",
  "name": null,
  "is_verified": 1,
  "created_at": "2019-05-16 10:43:34",
  "updated_at": "2019-05-16 11:03:06"
},

Ejemplo:

user = await User.query().where('email', formData.uid).orWhere('username', formData.uid).fetch()
user = user.first()

Con una sola línea conseguimos lo mismo que con el condicional.

Bibliografía

ADONIS.JS. Authentication. < https://adonisjs.com/docs/4.1/authentication >
[Última consulta: 18 de mayo de 2019]

MDN. RegExp.prototype.test(). < https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Objetos_globales/RegExp/test >
[Última consulta: 18 de mayo de 2019]

TYLERMCGINNIS. How to validate an email address in JavaScript. < https://tylermcginnis.com/validate-email-address-javascript/ >
[Última consulta: 18 de mayo de 2019]

ADONIS.JS. LUCID ORM, Getting Started; Query Builder. < https://adonisjs.com/docs/4.1/lucid#_query_builder >
[Última consulta: 19 de mayo de 2019]

ADONIS.JS (forum). orWhere in search query. < https://forum.adonisjs.com/t/orwhere-in-search-query/83 >
[Última consulta: 19 de mayo de 2019]

ADONIS.JS. Serialization. < https://adonisjs.com/docs/4.1/serializers >
[Última consulta: 19 de mayo de 2019]

ADONIS.JS (forum). How can I serialize a single object?. < https://forum.adonisjs.com/t/how-can-i-serialize-a-single-object/1203/6 >
[Última consulta: 19 de mayo de 2019]

ADONIS.JS (GitHub). Model instance should have toJSON method. < adonisjs/lucid#21 >
[Última consulta: 19 de mayo de 2019]

'use strict'
const User = use('App/Models/User')
class LoginController {
/**
* INICIAR SESIÓN
* -> formData: Obtener datos introducidos por el usuario (request).
* -> regexEmail: Regex que nos permite validar un email.
* -> user: Obtener el objeto user asociado al uid (email, nombre de usuario, etc.).
* -> token: Obtener un token de autenticación para el usuario.
*
* @param {Object} request https://adonisjs.com/docs/4.1/request
* @param {Object} auth https://adonisjs.com/docs/4.1/authentication
* @param {Object} response https://adonisjs.com/docs/4.1/response
* @return {Object.<string>} Devolvemos una respuesta HTTP en formato JSON.
*/
async logIn ({ request, auth, response }) {
let formData = request.only([ 'uid', 'password' ])
let regexEmail = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
let user = {}
let token = {}
try {
if (regexEmail.test(formData.uid)) {
// Si se trata de un email (validado con regex = true), buscamos el usuario mediante el uid = email.
user = await User.findByOrFail('email', formData.uid)
} else {
// Si no se trata de un email, el uid será un nombre de usuario (uid = username).
user = await User.findByOrFail('username', formData.uid)
}
// Validar credenciales y generar token
token = await auth.attempt(user.email, formData.password)
return response.status(200).json({
message: 'Cuenta de usuario/ria autenticada.',
code : 'loginOk',
data : {
user,
token
}
})
} catch (error) {
return response.status(404).json({
message: 'Cuenta de usuario/ria no encontrada. Regístrese para crear una cuenta.',
code : 'loginFailed'
})
}
}
}
module.exports = LoginController
'use strict'
const User = use('App/Models/User')
class LoginController {
/**
* INICIAR SESIÓN
* -> formData: Obtener datos introducidos por el usuario (request).
* -> user: Obtener el objeto user asociado al uid (email, nombre de usuario, etc.).
* -> token: Obtener un token de autenticación para el usuario.
*
* @param {Object} request https://adonisjs.com/docs/4.1/request
* @param {Object} auth https://adonisjs.com/docs/4.1/authentication
* @param {Object} response https://adonisjs.com/docs/4.1/response
* @return {Object.<string>} Devolvemos una respuesta HTTP en formato JSON.
*/
async logIn ({ request, auth, response }) {
let formData = request.only([ 'uid', 'password' ])
let user = {}
let token = {}
try {
// Buscar usuario/ria
user = await User.query().where('email', formData.uid).orWhere('username', formData.uid).fetch() // Obtenemos una colección.
user = user.first() // Obtener primer objeto de la colección.
// Validar credenciales y generar token
token = await auth.attempt(user.email, formData.password)
return response.status(200).json({
message: 'Cuenta de usuario/ria autenticada.',
code : 'loginOk',
data : {
user,
token
}
})
} catch (error) {
return response.status(404).json({
message: 'Cuenta de usuario/ria no encontrada. Regístrese para crear una cuenta.',
code : 'loginFailed'
})
}
}
}
module.exports = LoginController
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment