Yii2 Implementando Access Token para Autenticación REST

Los métodos de autenticación son los que nos permiten saber si un usuario pertenece a un sistema o no, generalmente cuando accedemos a algunas de nuestras cuentas de correo, facebook, etc lo que nosotros hacemos es autenticarnos con el servicio con nuestro usuario y clave. En este caso usaremos un Access Token para poder acceder a la aplicación.

Cuando usamos APIs en general, podemos acceder a la información de un servicio de una manera bastante sencilla. Nos gustaría que esto fuera por personas que tienen al menos una cuenta en el sistema o servicio.

En este caso veremos como implementar un access token para poder autentificarnos con la aplicación sin usar usuario o clave, lo que nos hará más sencillas las consultas.

Si estás leyendo esto lo más probable es que hayas o quieras desarrollar en Yii2 o al menos sepas que es un framework de desarrollo en php que usa MVC.

Yii2 viene por defecto, al menos en la versión avanzada, con un sistema de manejo de usuarios bastante potente. Lo que haremos ahora es simplemente modificar e implementar unos métodos para poder usar además los métodos de autentifícación disponibles en el framework. Ojo, no implementaremos esos métodos con este post.

Asumiendo que vamos a realizar una aplicación en donde un usuario solo tendrá un access token, modificaremos nuestra tabla de usuarios para que contenga además una columna tipo string única que almacenará nuestro token. La llamaremos access_token.

Teniendo la nueva columna nos vamos al modelo de usuario que estamos usando en nuestra aplicación y modificamos la función findIdentityByAccessToken   que se encarga en encontrar el usuario al cual corresponde el Access Token para que se vea como la que tenemos a continuación.

    public static function findIdentityByAccessToken($token, $type = null) {
        return static::findOne(['access_token' => $token]);
    }

Lo que hace es simplemente obtener la identidad del usuario al que corresponda ese Access Token.

Hasta ahora solo tenemos la función que corrobora el token y el usuario, pero no hemos creado el contenido del token. La idea en primera instancia para este caso es que el usuario ya tenga su Access Token al momento de ser creado. Así que agregaremos un método que se ejecutará antes de que el usuario sea creado.

   public function beforeSave($insert) {
        if ($this->isNewRecord) {
            $this->access_token = $this->getUniqueAccessToken();
        }
        return parent::beforeSave($insert);
    }

Con lo anterior designamos al nuevo usuario un Access Token único. Si lo notaron ese método no existe, por lo que debemos crearlo. Si bien la probabilidad de generar un string de largo X aleatorio que sea igual a otro es baja, debemos corroborar que no se repitan.

    private function getUniqueAccessToken() {
        $resultado = md5(Yii::$app->security->generateRandomString() . '_' . time());
        $identity = $this->findIdentityByAccessToken($resultado);
        if ($identity) {
            $resultado = $this->getUniqueAccessToken();
        }
        return $resultado;
    }

En este caso la función anterior se ejecutará hasta que encuentre un valor único con las características dadas. Si bien en este aso estoy usando el md5 de un string aleatorio, ustedes pueden usar otro hash o el string tal cual está.

Con esto ya puedes implementar los distintos métodos de autenticación para métodos REST proporcionados por YII2.

Cómo ejemplo, podríamos obtener la información de un API usando la autenticación por parámetros de la siguiente manera :

http://MIWEB.dev/v1/api/create?access-token=2b166b3d2b822d163244f63db6813792&idFuente=1

Deja un comentario

This site uses Akismet to reduce spam. Learn how your comment data is processed.