Crear token de autenticación en Laravel Sanctum para una Rest Api

- Andrés Cruz

In english
Crear token de autenticación en Laravel Sanctum para una Rest Api

Laravel sanctum es una maravilla para cuando queremos proteger una Rest Api creada con Laravel ya sea mediante tokens o un hibrido entre sección y cookies; antes de mostrarte como puedes hacer la implementación más tradicional, vamos a entrar un poco en la materia e introducir que es Sanctum.

¿Qué es Laravel Sanctum?

Laravel Sanctum es un paquete de autenticación para Laravel  que proporciona un método simple y seguro para autenticar aplicaciones de página única (SPAs) mediante los usuarios y proteger su API mediante tokens de API. Sanctum permite generar y administrar tokens de API, que se emiten mediante un recurso rest que implementamos y que es pasado al cliente para que este, cuando quiera acceder a recursos protegidos, deba de emplear dicho token de acceso y poder conectarse al recurso y consumir la respuesta de la API. 

Estos tokens son estupendos ya que los puedes usar para autenticar solicitudes de API y tambien para restringir el acceso a rutas, ya que, con el mismo, desde Laravel sabes de que usuario se trata que intenta consumir un recurso determinado y realizar alguna traza o limitante.

Generar tokens de acceso

Laravel Sanctum nos provee un sencillo mecanismo con el cual agregar autenticación a Rest Api, mediante Token de autenticación o por tokens de autenticación, en esta primera entrada, veremos cómo usar el mecanismo del token de autenticación que sería el esquema más tradicional.

Cabe mencionar que, no es necesario instalar Sanctum ya que, desde hace mucho tiempo, Sanctum forma parte de un proyecto en Laravel.

En nuestro controlador rest, para manejar el usuario, en el caso de nuestro curso en Laravel, sería el siguiente:

app\Http\Controllers\Api\UserController.php

Crearemos una función de login, usando la función de attempt con la cual, podemos comprobar credenciales de usuario que son provistas en la petición:

    $credentials = [
        'email' => $request->email,
        'password' => $request->password
    ];

Una vez comprobada las credenciales, creamos el token y devolvemos la respuesta:

Auth::user()->createToken('myapptoken')->plainTextToken;

Finalmente, el código completo:

public function login(Request $request)
{
    $credentials = [
        'email' => $request->email,
        'password' => $request->password
    ];
    if (Auth::attempt($credentials)) {
        $token = Auth::user()->createToken('myapptoken')->plainTextToken;
     session()->put('token', $token);
        return response()->json($token);
    }
    return response()->json("Usuario y/o contraseña inválido", 422);
}

Lo más importate es notar que, aunque sanctum provee de todos los mecanismos para generar el token, ya depende del usuario implementar la lógica necesaria para generar el token.

Más ejemplos con Sanctum

Por aquí te dejo otros ejemplos con autenticación en Laravel sanctum y protección de rutas.

En el caso de que el proyecto ya no disponga de Sanctum, debes instalar Laravel Sanctum usando Composer:

composer require laravel/sanctum

Luego, publicarás los archivos de configuración y migraciones de Sanctum:

php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

A continuación, ya podemos proteger nuestras rutas, para ello, usamos un middleware de autenticación en tu archivo de rutas. Por ejemplo:

routes/api.php

Route::middleware('auth:sanctum')->group(function () {
   Route::get('/post', function () {
       return view('dashboard');
   });
});

En este ejemplo, la ruta "/post" solo será accesible si el usuario está autenticado mediante el middleware de Sanctum.

Después de eso, puedes generar un token de API para un usuario autenticado. Por ejemplo:

$token = $user->createToken('token-name')->plainTextToken;

Este código generará un token de API para el usuario dado con el nombre "token-name". Luego, puedes usar el token para autenticar solicitudes de API; aquí tienes otro ejemplo de login con sanctum:

routes/api.php

use App\\Models\\User;
use Illuminate\\Http\\Request;
use Illuminate\\Support\\Facades\\Hash;

Route::post('/login', function (Request $request) {
    $user = User::where('email', $request->email)->first();

    if (! $user || ! Hash::check($request->password, $user->password)) {
        throw ValidationException::withMessages([
            'email' => ['The provided credentials are incorrect.'],
        ]);
    }

    $token = $user->createToken($request->device_name)->plainTextToken;

    return ['token' => $token];
});

Eso es solo un ejemplo básico de cómo puedes utilizar Laravel Sanctum en tu proyecto Laravel. Espero que te haya sido útil. Si tienes más preguntas, no dudes en hacerlas.

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.