> For the complete documentation index, see [llms.txt](https://dev-cucei-itrans.gitbook.io/siiau-api-client/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://dev-cucei-itrans.gitbook.io/siiau-api-client/caracteristicas/autenticacion.md).

# Autenticación

El paquete provee una funcionalidad de autenticación para los usuarios. Esta se integra con el sistema de autenticación de laravel.&#x20;

## <mark style="color:red;">Configurar</mark>

En el archivo de `config/auth.php` agregaremos un nuevo *provider*. Puede ser nombrado de cualquiere manera. El paquete recomienda el nombre de `siiau_users`.

{% code title="config/auth.php" %}

```php
return [

    /** ... Otras configuraciones */

    'providers' => [
    
        /** ... Otros proveedores */

        'siiau_users' => [
            'driver' => 'siiau',
            'decorate' => 'users',
        ],
    ],
    
    /** ... */

];
```

{% endcode %}

Y en el mismo archivo agregaremos un nuevo guard que use el nuevo proveedor. De nuevo, el guard puede tener el nombre que queramos. En este caso le pusimos `siiau`.

{% code title="config/auth.php" %}

```php
return [

    /** ... Otras configuraciones */

    'guards' => [
    
        /** ... Otros guards */
        
        'siiau' => [
            'driver' => 'session',
            'provider' => 'siiau_users',
        ],
    ],
    
    /** ... */

];
```

{% endcode %}

Por ultimo, para que funcione, sera necesario agregar la interfaz `SiiauAuthenticable`  a tu modelo de `User`. Lo que necesita esta interfaz es una manera de obtener el código de usuario de SIIAU desde el módelo. Si tu modelo tiene una columa con esta propiedad puedes usar la implementación por defecto con el trait `HasCodigoSiiau`.

<pre class="language-php" data-title="app/Models/User.php"><code class="lang-php">namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
<strong>use Siiau\ApiClient\Concerns\HasCodigoSiiau;
</strong>use Siiau\ApiClient\Contracts\SiiauAuthenticable;

final class User extends Authenticatable implements SiiauAuthenticable
{
<strong>    use HasCodigoSiiau;
</strong>    
}
</code></pre>

En caso de que tu modelo no tenga esa columa, tendras que implementar el método `getCodigoSiiau` y devolver el código de donde sea que proveea. El siguiente es un ejemplo en caso de que el código se encuentre en una relación.

{% code title="app/Models/User.php" %}

```php
namespace App\Models;

use Illuminate\Database\Eloquent\Relations\HasOne;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Siiau\ApiClient\Contracts\SiiauAuthenticable;

final class User extends Authenticatable implements SiiauAuthenticable
{    
    public function siiauAccount(): HasOne
    {
        return $this->hasOne(SiiauAccount::class);
    }
    
    public function getCodigoSiiau(): ?string
    {
        return $this->siiauAccount?->codigo;
    }
}
```

{% endcode %}

## <mark style="color:red;">Autenticar</mark>

Una vez configurado, para autenticar a tus usuarios, en tu controlador podrias usar el nuevo guard de la siguiente manera:

{% code title="app/Http/Controllers/LoginController.php" %}

```php
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
 
final class LoginController extends Controller
{
    public function authenticate(Request $request): RedirectResponse
    {
        $credentials = $request->validate([
            'codigo' => ['required'],
            'password' => ['required'],
        ]);
        
        if (auth('siiau')->attempt($credentials)) {
            // Authentication was successful...
            auth()->login(auth('siiau')->user());
            
            $request->session()->regenerate();
 
            return redirect()->intended('dashboard');
        }
 
        return back()->withErrors([
            'codigo' => 'The provided credentials do not match our records.',
        ])->onlyInput('email');
    }
}
```

{% endcode %}

En caso de que el código no se guarde en la misma tabla del modelo `SiiauAuthenticable` , deberas pasar una `scope` que filtre adecuadamente el modelo.&#x20;

A continuación se muestra el ejemplo de como seria si se encuentra en una relación:

```php
use Illuminate\Database\Eloquent\Builder;
 
if (auth('siiau')->attempt([
    'password' => $password,
    static function (Builder $query) use ($codigo): void {
        $query->whereRelation('siiauAccount', 'codigo', $codigo);
    },
])) {
    // Authentication was successful...
}
```
