dennisharrison / laravel-auth0

Auth0 Laravel SDK。提供直接且经过测试的方法来实现身份验证,并访问Auth0的管理API端点。

7.4.1 2023-03-01 21:31 UTC

This package is not auto-updated.

Last update: 2024-09-27 04:10:59 UTC


README

laravel-auth0

Auth0认证和管理API的Laravel SDK。

Package Build License

📚 文档 - 🚀 入门 - 💬 反馈

文档

  • 有状态应用程序
    • 快速入门 — 使用Auth0向Laravel应用程序添加登录、注销和用户信息。
    • 示例应用程序 — 一个集成了Auth0的Laravel Web应用程序示例。
  • 无状态应用程序
    • 快速入门 — 使用Auth0向后端Laravel应用程序添加访问令牌处理和路由授权。
    • 示例应用程序 — 一个集成了Auth0的Laravel后端应用程序示例。
  • 示例 — 常见场景的代码示例。
  • 文档站点 — 探索我们的文档站点,了解更多关于Auth0的信息。

入门

要求

  • PHP 8.0+
  • Laravel 8 / Laravel 9
  • app/Http/Kernel.php中启用Illuminate\Session\Middleware\StartSession

请查阅我们的支持策略,了解未来语言和框架版本将何时停止支持。

Octane支持目前是实验性的,不建议在生产环境中使用。

安装

使用Composer将依赖项添加到您的应用程序中

composer require auth0/login

配置Auth0

Auth0仪表板中创建一个Regular Web Application。确认“Token Endpoint Authentication Method”设置为POST

接下来,在“设置”页面下的“应用程序URI”部分配置您的应用程序的回调和注销URL

  • 允许的回调URL:Auth0在身份验证期间将重定向到的应用程序的URL,例如,https://:3000/callback
  • 允许的注销URL:Auth0在用户注销后重定向到的应用程序的URL,例如,https://:3000/login

请注意域名Client IDClient Secret。这些值将在稍后的配置中使用。

发布SDK配置

使用Laravel的CLI在项目中生成Auth0配置文件

php artisan vendor:publish --tag auth0-config

项目中将出现一个新文件,app/config/auth0.php。您应避免直接修改此文件。

配置您的.env文件

打开您应用程序目录中的.env文件,并添加以下适合您应用程序类型的行

对于有状态Web应用程序
AUTH0_DOMAIN="Your Auth0 domain"
AUTH0_CLIENT_ID="Your Auth0 application client ID"
AUTH0_CLIENT_SECRET="Your Auth0 application client secret"
AUTH0_COOKIE_SECRET="A randomly generated string"

使用openssl rand -hex 32为您的AUTH0_COOKIE_SECRET提供一个足够长且随机的字符串。

对于无状态后端应用程序
AUTH0_STRATEGY="api"
AUTH0_DOMAIN="Your Auth0 domain"
AUTH0_CLIENT_ID="Your Auth0 application client ID"
AUTH0_CLIENT_SECRET="Your Auth0 application client secret"
AUTH0_AUDIENCE="Your Auth0 API identifier"

设置您的Laravel应用程序

集成SDK的Guard需要对您的config\auth.php文件进行修改。

首先,找到defaults部分。将默认guard设置为auth0,如下所示

// 📂 config/auth.php
'defaults' => [
    'guard' => 'auth0',
    // 📝 Leave any other settings in this section alone.
],

接下来,找到guards部分,并在其中添加auth0

// 👆 Continued from above, in config/auth.php
'guards' => [
    // 📝 Any additional guards you use should stay here, too.
    'auth0' => [
        'driver' => 'auth0',
        'provider' => 'auth0',
    ],
],

接下来,找到providers部分,并同样在其中添加auth0

// 👆 Continued from above, in config/auth.php
'providers' => [
    // 📝 Any additional providers you use should stay here, too.
    'auth0' => [
        'driver' => 'auth0',
        'repository' => \Auth0\Laravel\Auth\User\Repository::class
    ],
],

尽管默认已启用,但现在确保在您的app/Http/Kernel.php文件中启用了StartSession中间件是个好时机

protected $middlewareGroups = [
    'web' => [
        // ...
        \Illuminate\Session\Middleware\StartSession::class,
        // ...
    ],
];

将登录添加到有状态Web应用程序

对于提供登录和登出的常规Web应用程序,我们提供了预构建的路由控制器,可以添加到您的app/routes/web.php文件中,这些控制器将自动处理您的应用程序的认证流程,使用Auth0为您完成

Route::get('/login', \Auth0\Laravel\Http\Controller\Stateful\Login::class)->name('login');
Route::get('/logout', \Auth0\Laravel\Http\Controller\Stateful\Logout::class)->name('logout');
Route::get('/auth0/callback', \Auth0\Laravel\Http\Controller\Stateful\Callback::class)->name('auth0.callback');

使用中间件保护路由

此SDK包括中间件,用于简化您的Laravel路由的认证(常规Web应用程序)或授权(后端API应用程序),具体取决于您的应用程序类型

有状态Web应用程序

这些用于处理登录和登出的传统应用程序

auth0.authenticate中间件将检查是否存在用户会话,并将没有会话的任何请求重定向到登录路由

Route::get('/required', function () {
    return view('example.user.template');
})->middleware(['auth0.authenticate']);

auth0.authenticate.optional中间件将检查是否存在用户会话,但不会拒绝或重定向没有会话的请求,允许您将这些请求视为“访客”请求

Route::get('/', function () {
    if (Auth::check()) {
        return view('example.user.template');
    }

    return view('example.guest.template');
})->middleware(['auth0.authenticate.optional']);

请注意,example.user.templateexample.guest.templates视图只是示例,并不属于SDK的一部分;请根据您的应用程序适当替换这些内容。

无状态后端应用程序

这些应用程序通过请求的'Authorization'头接受访问令牌

auth0.authorize中间件将解析访问令牌并拒绝任何包含无效令牌的请求

Route::get('/api/private', function () {
    return response()->json([
        'message' => 'Hello from a private endpoint! You need to be authenticated to see this.',
        'authorized' => Auth::check(),
        'user' => Auth::check() ? json_decode(json_encode((array) Auth::user(), JSON_THROW_ON_ERROR), true) : null,
    ], 200, [], JSON_PRETTY_PRINT);
})->middleware(['auth0.authorize']);

auth0.authorize中间件还允许您根据范围可选地过滤请求的访问令牌

Route::get('/api/private-scoped', function () {
    return response()->json([
        'message' => 'Hello from a private endpoint! You need to be authenticated and have a scope of read:messages to see this.',
        'authorized' => Auth::check(),
        'user' => Auth::check() ? json_decode(json_encode((array) Auth::user(), JSON_THROW_ON_ERROR), true) : null,
    ], 200, [], JSON_PRETTY_PRINT);
})->middleware(['auth0.authorize:read:messages']);

auth0.authorize.optional中间件将解析可用的访问令牌,但不会阻止没有令牌的请求。这在您想将无令牌请求视为“访客”请求时很有用

Route::get('/api/public', function () {
    return response()->json([
        'message' => 'Hello from a public endpoint! You don\'t need to be authenticated to see this.',
        'authorized' => Auth::check(),
        'user' => Auth::check() ? json_decode(json_encode((array) Auth::user(), JSON_THROW_ON_ERROR), true) : null,
    ], 200, [], JSON_PRETTY_PRINT);
})->middleware(['auth0.authorize.optional']);

支持策略

我们的支持窗口由Laravel发布支持PHP发布支持计划决定,并且当下面的Laravel框架或PHP运行时停止接收安全修复时,支持结束,以先到者为准。

已到期的语言或框架版本的弃用不被视为破坏性更改,因为Composer优雅地处理这些场景。遗留应用程序将停止从我们这里接收更新,但将继续在这些不受支持的SDK版本上运行。请确保您的PHP环境和Laravel框架依赖始终是最新的。

Octane支持

Octane兼容性目前被视为实验性和不受支持的。

尽管我们正在努力确保SDK完全与该功能兼容,但我们不建议在生产环境中使用此功能,直到我们有充分的信心并宣布支持。由于Octane对Laravel核心行为的激进更改,存在尚未完全识别或解决的问题。

在努力实现完整的Octane支持时,我们非常欢迎反馈和错误修复贡献。

反馈

贡献

我们感谢对该存储库的反馈和贡献!在您开始之前,请查看以下内容

提出问题

要提供反馈或报告错误,请在我们的问题跟踪器上提出问题

漏洞报告

请不要在公共Github问题跟踪器上报告安全漏洞。有关披露安全问题的负责任披露计划详细说明了程序。

Auth0是一个易于实现、可定制的认证和授权平台。要了解更多信息,请访问为什么选择Auth0?

本项目采用MIT许可协议。有关更多信息,请参阅许可文件