Skip to content

Instantly share code, notes, and snippets.

@cruzmayra
Last active December 2, 2021 02:14
Show Gist options
  • Save cruzmayra/750614d318806db003bb6232d9bf3979 to your computer and use it in GitHub Desktop.
Save cruzmayra/750614d318806db003bb6232d9bf3979 to your computer and use it in GitHub Desktop.
authentication flow with Passport

Roles de OAuth

  • Propietario del recurso (usuario)
  • Cliente (aplicación)
  • Servidor de recuros (API)
  • Servidor de autorización (API)

Flujo de protocolo abstracto

  1. La aplicación solicita autorización para acceder a los recursos de servicio del usuario
  2. Si el usuario autoriza la solicitud, la aplicación recibe la autorización
  3. La aplicación solicita al servidor de autorización (API), presentando la autenticación de su identidad y la autorización otorgada La aplicación solicita al servidor de autorización (API) un token de acceso presentando la autenticación de su propia identidad y la autorización otorgada
  4. Si la identidad de la aplicación es autenticada y la autorización es válida, el servidor de autorización (API) emite un token de acceso a la aplicación. La autorización finaliza
  5. La aplicación solicita el recurso al servidor de recursos (API) y presenta el token de acceso para autenticarse
  6. Si el token de acceso es válido, el servidor de recursos (API) provee el recurso a la aplicación

Registro de la aplicación

Antes de utilizar OAuth, debes registrar tu aplicación con el servicio utilizando el siguiente comando:

php artisan passport:client

Vamos a proporcionar la siguiente información:

  • Nombre del cliente (aplicación)
  • La url de redirección después de la autorización

Una vez esté registrada tu aplicación, el servicio emitirá “credenciales del cliente” en forma de un identificador de cliente y un secreto de cliente, no los pierdas.

Obtención de la autorización: Código de autorización

Paso 1. Obtener código de autorización

La aplicación hace una petición a la ruta /oauth/authorize al servidor de autorización

<?php
    require __DIR__ . '/../wp-load.php';

    $str=rand();
    $state = sha1($str);

    session_start();
    $_SESSION['state'] = $state;

    $query = http_build_query([
        'client_id' => 'tu-cliente-id',
        'redirect_uri' => 'http://dominio-aplicacion/oauth/callback',
        'response_type' => 'code',
        'scope' => 'scope-app',
        'state' => $state,
    ]);

    header('Location: https://dominio-servidor/oauth/authorize?'.$query);

Paso 2. El usuario autoriza a la aplicación

Ahora el usuario debe iniciar sesión en el servicio para autenticar su identidad. Luego, el servicio solicitará autorizar o denegar el acceso de la aplicación a su cuenta.

Paso 3. La aplicación recibe el código de autorización

Si el usuario autoriza a la aplicación, el servicio reorienta el agente-usuario al “redirect URI” de la aplicación, misma que se especificó durante el registro del cliente, junto con un código de autorización.

Paso 4. La aplicación solicita el token de acceso

La aplicación solicita un token de acceso de la API, pasándole el código de autorización junto con los detalles de autenticación, incluido el secreto del cliente, al servidor.

   <?php
    require __DIR__ . '/../wp-load.php';
    session_start();
    $state = $_SESSION['state'];


    if(strlen($state) === 0 && $state !== $_GET['state']) {
        echo "No hay state :(";
        exit();
    }

    $args = [
        'headers' => [
            'Content-Type' => 'application/x-www-form-urlencoded'
        ],
        'body' => [
            'grant_type' => 'authorization_code',
            'client_id' => 'tu-client-id',
            'client_secret' => 'tu-client-secret',
            'redirect_uri' => 'http://dominio-aplicacion/oauth/callback.php',
            'code' => $_GET['code'],
        ]
    ];

    $response = wp_remote_post('https://dominio-servidor/oauth/token', $args);

    print_r(json_decode($response['body'], true)); 

Paso 5. La aplicación recibe el token de acceso

Si la autorización es válida, la API enviará una respuesta a la aplicación, con el token de acceso (y, opcionalmente, un token de actualización). La respuesta completa se verá más o menos así:

    [
        'token_type' => 'Bearer',
        'expires_in' => 172800,
        'access_token' => 'eyJ0eXAiOiJKV1QiLCJ...',
        'refresh_token' => 'def502007eab88580ad...'
     ]

¡Ahora la aplicación está autorizada! Puedes utilizar el token para acceder a la cuenta del usuario a través de la API de servicio 💖

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment