# 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...
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://dev-cucei-itrans.gitbook.io/siiau-api-client/caracteristicas/autenticacion.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
