Aller au contenu principal
Version: 5.x

Authentification

Introduction​

Bow Framework fournit un système d'authentification flexible supportant deux méthodes : l'authentification par session et par JWT (JSON Web Token).

Configuration​

Le fichier config/auth.php définit les guards et leurs paramètres :

config/auth.php
return [
// Guard par défaut
'default' => 'web',

// Authentification par session
'web' => [
'type' => 'session',
'model' => App\Models\User::class,
'credentials' => [
'username' => 'email',
'password' => 'password',
],
],

// Authentification par JWT (API)
'api' => [
'type' => 'jwt',
'model' => App\Models\User::class,
'credentials' => [
'username' => 'email',
'password' => 'password',
],
],
];

Modèle utilisateur​

Le modèle utilisateur doit étendre Bow\Auth\Authentication :

app/Models/User.php
namespace App\Models;

use Bow\Auth\Authentication;

class User extends Authentication
{
protected ?string $table = 'users';

// Pour JWT: attributs personnalisés dans le token
public function customJwtAttributes(): array
{
return [
'role' => $this->role,
];
}
}

Authentification par session​

Connexion​

use Bow\Auth\Auth;

// Tentative de connexion
$credentials = [
'email' => $request->get('email'),
'password' => $request->get('password'),
];

if (Auth::guard('web')->attempts($credentials)) {
return redirect('/dashboard');
}

return back()->withErrors(['message' => 'Identifiants incorrects']);

Via le helper​

// Helper app_auth
if (app_auth('web')->attempts($credentials)) {
return redirect('/dashboard');
}

Vérifier l'authentification​

// Utilisateur connecté ?
if (Auth::guard('web')->check()) {
// Connecté
}

// Utilisateur non connecté ?
if (Auth::guard('web')->guest()) {
// Non connecté
}

Récupérer l'utilisateur​

// Instance complète
$user = Auth::guard('web')->user();
echo $user->name;

// ID uniquement
$userId = Auth::guard('web')->id();

Connexion manuelle​

$user = User::where('email', $email)->first();

if ($user && Hash::check($password, $user->password)) {
Auth::guard('web')->login($user);
}

Déconnexion​

Auth::guard('web')->logout();

return redirect('/login');

Authentification JWT​

Installation requise

Pour utiliser JWT, installez le package Policier :

composer require bowphp/policier

Configuration JWT​

config/policier.php
return [
'signkey' => app_env('APP_JWT_SECRET'),
'exp' => 3600 * 24 * 7, // 7 jours
'iss' => app_env('APP_URL', 'http://localhost'),
'aud' => app_env('APP_URL', 'http://localhost'),
'alg' => 'HS512',
];

Connexion API​

use Bow\Auth\Auth;

class AuthController
{
public function login(Request $request)
{
$credentials = $request->only(['email', 'password']);

if (!Auth::guard('api')->attempts($credentials)) {
return response()->json([
'error' => 'Identifiants incorrects'
], 401);
}

$token = Auth::guard('api')->getToken();

return response()->json([
'token' => $token->getValue(),
'expires_in' => $token->get('exp'),
]);
}

public function me(Request $request)
{
$user = Auth::guard('api')->user();

return response()->json($user);
}

public function logout()
{
Auth::guard('api')->logout();

return response()->json(['message' => 'Déconnecté']);
}
}

Utilisation côté client​

# Avec le header Authorization
curl -H "Authorization: Bearer TOKEN" https://api.example.com/me

Middlewares​

Middleware d'authentification​

routes/app.php
// Routes protégées par session
$app->get('/dashboard', 'DashboardController::index')->middleware('auth');

// Routes protégées par JWT
$app->get('/api/profile', 'Api\ProfileController::show')->middleware('api');

Grouper les routes protégées​

routes/app.php
$app->prefix('/admin')->middleware('auth')->group(function () use ($app) {
$app->get('/users', 'Admin\UserController::index');
$app->get('/settings', 'Admin\SettingsController::index');
});

$app->prefix('/api/v1')->middleware('api')->group(function () use ($app) {
$app->get('/me', 'Api\UserController::me');
$app->put('/me', 'Api\UserController::update');
});

Middleware personnalisé​

app/Middlewares/CustomAuthMiddleware.php
namespace App\Middlewares;

use Bow\Auth\Auth;
use Bow\Http\Request;

class CustomAuthMiddleware
{
public function process(Request $request, callable $next)
{
if (Auth::guard('web')->guest()) {
return redirect('/login');
}

return $next($request);
}
}

Exemple complet​

Contrôleur d'authentification​

app/Controllers/AuthController.php
namespace App\Controllers;

use App\Models\User;
use Bow\Auth\Auth;
use Bow\Http\Request;
use Bow\Security\Hash;

class AuthController
{
public function showLogin()
{
if (Auth::guard('web')->check()) {
return redirect('/dashboard');
}

return view('auth/login');
}

public function login(Request $request)
{
$validation = $request->validate([
'email' => 'required|email',
'password' => 'required|min:6',
]);

if ($validation->fails()) {
return back()->withErrors($validation->getMessages());
}

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

if (Auth::guard('web')->attempts($credentials)) {
return redirect('/dashboard');
}

return back()->withErrors(['message' => 'Email ou mot de passe incorrect']);
}

public function register(Request $request)
{
$validation = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8|confirmed',
]);

if ($validation->fails()) {
return back()->withErrors($validation->getMessages());
}

$user = User::create([
'name' => $request->get('name'),
'email' => $request->get('email'),
'password' => Hash::make($request->get('password')),
]);

$user->persist();

Auth::guard('web')->login($user);

return redirect('/dashboard');
}

public function logout()
{
Auth::guard('web')->logout();

return redirect('/login');
}
}

Routes​

routes/app.php
// Pages publiques
$app->get('/login', 'AuthController::showLogin');
$app->post('/login', 'AuthController::login');
$app->get('/register', 'AuthController::showRegister');
$app->post('/register', 'AuthController::register');
$app->post('/logout', 'AuthController::logout');

// Pages protégées
$app->get('/dashboard', 'DashboardController::index')->middleware('auth');

Méthodes disponibles​

MéthodeDescription
attempts($credentials)Tente d'authentifier avec les identifiants
check()Vérifie si l'utilisateur est connecté
guest()Vérifie si l'utilisateur n'est pas connecté
user()Retourne l'utilisateur authentifié
id()Retourne l'ID de l'utilisateur
login($user)Connecte manuellement un utilisateur
logout()Déconnecte l'utilisateur
getToken()(JWT) Retourne le token généré
guard($name)Change de guard

Il manque quelque chose ?

Si vous rencontrez des problèmes avec la documentation ou si vous avez des suggestions pour améliorer la documentation ou le projet en général, veuillez déposer une issue pour nous, ou envoyer un tweet mentionnant le compte Twitter @bowframework ou sur directement sur le github.