API RESTful con Laravel 5.4
  • Introduction
  • Homestead
  • Modelo
  • Migraciones
  • Seeders - Factories
  • Rutas
  • Traits - generalizar respuestas de la api
  • Controladores
  • Respuestas
  • Respuestas: Caché de resultados
  • Controladores para relaciones (operaciones complejas)
  • Imágenes
  • Correos
  • HATEOAS
  • Autenticación de usuarios con sesiones
  • OAuth 2
  • Access Tokens
  • Gestionar clientes usando Vue.js
  • Documentación con Swagger
Powered by GitBook
On this page
  • Proteger rutas: Client Grant Type Tokens
  • Proteger rutas: Otros Grant Type Tokens

Was this helpful?

Access Tokens

Proteger rutas: Client Grant Type Tokens

Proporcionar acceso a un cliente válido en el sistema sin necesidad de que esté autorizado por un usuario, así cualquier cliente registrado va a poder acceder a esas rutas. Sin embargo, al no tener autorización de un usuario específico, no se tiene un control sobre si realmente por medio de ese token se puede hacer determinada acción.

Entonces para realizar las peticiones se requiere únicamente de las credenciales del cliente

Registrar middleware client_credentials en app/Http/Kernel.php

protected $routeMiddleware = [
    ...
    'client.credentials' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
    ...
];

Proteger las rutas básicas del sistema: lista de productos, info de un producto, etc, para esto se puede

Registrar middleware en controladores que lo requieran para métodos index y/o show según sea el caso:

class CategoryController extends ApiController
{
    public function __construct()
    {
        $this->middleware('client.credentials')->only(['index', 'show']);
        $this->middleware('transform.input:' . CategoryTransformer::class)->only(['store', 'update']);
    }
    ...
}

o si se desea proteger todos los métodos de los controladores, hacerlo directamente en el archivo de rutas

Route::middleware('client.credentials')->group(function () {
    Route::resource('categories', 'ApiControllers\v1\CategoryController', ['only' => ['index', 'show']]);
});

Al enviar petición a alguna de las rutas protegidas obtenemos:

{
    "error": "Unauthenticated",
    "code": 401
}

Para obtener autorización se debe usar un cliente válido en la API para obtener un access token:

  • Crear cliente

Nota: no es necesario asignar a un usuario, se puede colocar cualquier cosa (como 0)

php artisan passport:client

Which user ID should the client be assigned to?:
> 0

What should we name the client?:
> cliente

Where should we redirect the request after authorization? [http://localhost/auth/callback]:
> 

New client created successfully.
Client ID: 3
Client secret: EggaIpAEZRorCwYHg6Z77Gh1rm3XEW0n3hKaGvLC
  • Obtener access token para usuario creado

Hacer post a la ruta oauth/token con client_id y client_secret

  • Usar token al hacer peticiones, enviarlo con la cabecera Authorization y el método Bearer seguido de un espacio y el token

Proteger rutas: Otros Grant Type Tokens

En este caso, las peticiones sean realizadas con un token que esté relacionado con un usuario válido en el sistema. Existen varios tokens que cumplen con esta condición: password token, personal token (de cada usuario), token implícito, y el tradicional de código de autorización.

En el controalador base del sistema ApiController, en el constructor usar un middeware

public function __construct()
{
    $this->middleware('auth:api'); // middleware: auth, guard: api
}

En los otros controladores (que no hacen uso del client credentials) llamar al constructor padre (antes descrito) para implementar el middleware

public function __construct()
{
    parent::__construct();
}

Para los que hacen uso de client credentials en algunos métodos, proteger los restantes con auth:api

public function __construct()
{
    $this->middleware('client.credentials')->only(['index', 'show']);
    $this->middleware('auth:api')->except(['index', 'show']);
    ...
}

En UserController, se debe exceptuar de validaciones al método verify, pues este es llamado cuando el usuario hace click sobre el enlace de verificación que le fue enviado al correo y no hay manera de que envíe algún token

class UserController extends ApiController
{
    public function __construct()
    {
        $this->middleware('client.credentials')->only(['store', 'resend']);
        $this->middleware('auth:api')->except(['store', 'resend', 'verify']);
        ...
    }
}
  • Password Grant Tokens

Para obtener un access token con información del usuario, se requiere información tanto del cliente como del usuario directamente en el cuerpo de la petición.

  • Crear cliente con tipo password

php artisan passport:client --password

What should we name the password grant client? [API RESTful Password Grant Client]:
> password

Password grant client created successfully.
Client ID: 4
Client Secret: UMtrV0nDrnilDQVErHbDNttOHNJgpLbLK6IibyQm
  • Obtener access token para usuario creado

  • Usar token para las peticiones

  • Personal Access Tokens

El access token personal nunca expira, se recomienda ser usado con fines de prueba o para proporcionar cierto acceso al usuario.

Crear cliente con tipo password

php artisan passport:client --personal

What should we name the personal access client? [API RESTful Personal Access Client]:
> 

Personal access client created successfully.
Client ID: 5
Client Secret: YGjw5OCy2Us2uV53SqQnV45Is3j9RG6bfFgaYHLu
  • Access Token por medio de Código de Autorización

El usuario se autentica en el sistema y en caso de que autorice y su autenticación sea correcta, el cliente podrá obtener el access token sin necesidad de conocer los datos del usuario.

Es el grant type más utilizado por Facebook, Twitter, etc.

PreviousOAuth 2NextGestionar clientes usando Vue.js

Last updated 6 years ago

Was this helpful?