Xamarin - Lecciones aprendidas 3

Esta es la tercera parte de las lecciones aprendidas con Xamarin. Aquí están la primera y la segunda.

Quiero insistir, especialmente en este post, que no quiero hablar de "buenas prácticas" sino de cosas que me han ayudado a solucionar situaciones específicas. Esta vez son los códigos QR como opción para "iniciar sesión" en las apps.

Autorización usando QR.

Algunas apps tienen un portal para mostrar reportes, modificar parámetros, registrar usuarios, etc. que ya está protegido por contraseña. Ese portal se puede aprovechar para mostrar un código QR que contiene el token de autorización para consumir servicios web. Es como "implementar la segunda parte de OAuth2" (aquí está bien explicado todo el protocolo OAuth2). Esto fue lo que hice:


Genero el código siguiendo la documentación de asp.net core sobre Hash Codes y me aseguro que sólo el usuario autorizado pueda verlo, usando Authorization Handlers. Tiene nombre de la app, el id del recurso y el token de autorización. Del lado del servidor, almaceno el token y valido cada solicitud del API.

Por ejemplo, si suponemos que el usuario tiene un único ítem y que el token es una propiedad del ítem y no del usuario, el código quedaría así:

[HttpGet]
public async Task<IActionResult> Get(int id)
{
    var appCode = Request.Headers["<SomeHeaderName>"].ToString();
    var (isAuthorized, item) = await CodeIsValid(appCode, id);
    if (!isAuthorized)
    {
        return BadRequest();  // Puede ser Unauthorized();
    }

    return Ok(item);
}

...

protected async Task<(bool, Item)> CodeIsValid(string appCode, int itemId)
{
    var item = await Context.Item.SingleOrDefaultAsync(

        i => i.Id == itemId &&
        i.AppCode == appCode);
    return (item != null, item);
}



Dependiendo de la aplicación, el token puede ser una propiedad del usuario, del perfil, de un ítem de más bajo nivel, etc. Se puede generar usando el Id del usuario, el SecurityStamp o un GUID aleatorio. Se debe regenerar cada vez que el usuario desee o cuando cambie la contraseña. Y se deben desconectar todas las aplicaciones que no tengan un código válido.

Del lado del cliente uso ZXing.Net.Mobile.Forms para escanear el QR y Xam.Plugins.Settings para almacenar el token.

Comentarios

Entradas más populares de este blog

Ampliar el sistema de archivos de una máquina virtual Ubuntu

Adviento C# 2020: Diario de ASP.NET

Historia de una App: un mes en la Tienda Windows y en Google Play