chivincent/laravel-kratos

Laravel Kratos 与 ory/kratos 集成认证功能

v1.2.0 2023-07-25 07:22 UTC

This package is auto-updated.

Last update: 2024-09-29 18:34:43 UTC


README

Testing

简介

Laravel Kratos 将认证功能与 ory/kratos 集成。

需求

  • 我正在使用 Laravel 构建 API。
  • 由于 Kratos 已经实施,我没有使用 Laravel 内置的认证功能。
    • 未来也不会使用它们。
  • 前端是独立的项目
    • 前端通过 Kratos 服务器进行认证,并接收 ory_kratos_session cookie。
    • 前端使用带有 ory_kratos_session cookie 的请求对 Laravel API 进行调用。

安装

composer require chivincent/laravel-kratos

配置

php artisan vendor:publish --provider="Chivincent\LaravelKratos\KratosServiceProvider"
  • 检查 config/kratos.php,确保 Kratos 服务的端点。

  • 更新 config/auth.php

<?php

return [
    // ...
    'guards' => [
        'kratos' => [
            'driver' => 'kratos',
            'provider' => 'kratos', // or 'kratos-database'
        ],    
    ],
    // ...
];
  • 更新 config/cors.php
<?php

return [
    // ...
    
    'allowed_origins' => ['http://127.0.0.1:4455'], // Port 4455 is the default application of Kratos Frontend UI
    
    // ...
    
    'supports_credentials' => true,
    
    // ...
]; 

数据库配置

如果使用 kratos-database 作为 auth.guards.kratos.provider 的 UserProvider,则设置默认用户模型的连接非常有用。

  • 更新 config/database.php,以下是一个 Postgresql 的示例
<?php

return [
    // ...
    'connections' => [
        'kratos' => [ // connection name should as same as `config('kratos.user_providers.kratos-database.connection')` 
            'driver' => 'pgsql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '5432'),
            'database' => env('DB_KRATOS_DATABASE', 'kratos'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'charset' => 'utf8',
            'prefix' => '',
            'prefix_indexes' => true,
            'search_path' => 'public',
            'sslmode' => 'prefer',
        ],    
    ]
    // ... 
];

必须验证邮箱

Laravel 使用 Illuminate\Contracts\Auth\MustVerifyEmail 来检查用户的邮箱是否已验证。

可以通过扩展模型轻松实现 implements Illuminate\Contracts\Auth\MustVerifyEmail

// app/Models/User.php

use Chivincent\LaravelKratos\Models\KratosIdentity;
use Chivincent\LaravelKratos\Models\KratosUser;
use Illuminate\Contracts\Auth\MustVerifyEmail;

// If using "kratos" user provider:
class User extends KratosIdentity implements MustVerifyEmail
{
}

// If using "kratos-database" user provider:
//class User extends KratosUser implements MustVerifyEmail
//{
//}

用法

routes/api.php

Route::middleware('auth:kratos')
    ->get('user', fn (Request $request) => response()->json($request->user()));