24slides/auth-connector


README

Latest Stable Version Software License Build Status Quality Score Code Coverage Total Downloads

简化了与第三方服务的集成,包括HTTP客户端、身份验证守卫、同步、加密等现成解决方案。

入门指南

安装

  • 定义以下环境变量,可以从服务器管理员处获取
JWT_SECRET=

SERVICE_AUTH_ENALBED=true
SERVICE_AUTH_URL=
SERVICE_AUTH_PUBLIC=
SERVICE_AUTH_SECRET=
  • 通过Composer安装依赖项:composer require 24slides/auth-connector
  • 将包提供者添加到config/app.php
'providers' => [
    ...
    Slides\Connector\Auth\ServiceProvider::class,

提供者必须在AuthServiceProvider之后定义。

  • config/auth.php中定义身份验证守卫
'guards' => [
    ...
    
    'authService' => [
        'driver' => 'authServiceToken',
        'provider' => 'users',
    ],
    
    'fallback' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
],

回退是你的默认身份验证守卫,当远程服务禁用时激活

  • 将默认守卫替换为authService
'defaults' => [
    'guard' => 'authService',
    'passwords' => 'users',
],

如果您想启用IDE功能,如提示,则需要安装barryvdh/laravel-ide-helper

  • 发布配置和迁移
php artisan vendor:publish --provider Slides\Connector\Auth\ServiceProvider
  • 运行已发布的迁移:php artisan migrate

迁移向您的用户模型添加了remote_id列,该列应表示同步用户的标识符。

  • 禁用身份验证cookie的加密,该cookie用于标识用户

app/Http/Middleware/EncryptCookies

/**
 * The names of the cookies that should not be encrypted.
 *
 * @var array
 */
protected $except = [
    'authKey'
];
  • 禁用验证传入webhooks的CSRF令牌

app/Http/Middleware/VerifyCsrfToken

/**
 * The URIs that should be excluded from CSRF verification.
 *
 * @var array
 */
protected $except = [
    'connector/webhook/*'
];

同步用户

要允许同步用户,请在您的User模型上实现Slides\Connector\Auth\Sync\Syncable接口。

有一个助手特质Slides\Connector\Auth\Concerns\UserHelper,它涵盖了几乎所有方法,除了需要两位数字国家代码(ISO 3166-1 alpha-2)的retrieveCountry方法。如果您有自定义属性,可以覆盖那里的方法。

身份验证处理器

处理器实现身份验证操作,并包装在数据库事务中。它只是一个层,用于保持逻辑在一个地方。

要生成处理器,您应该使用以下命令

php artisan make:auth-handlers

它将在App\Services\Auth命名空间下为您创建一个名为AuthHandlers.php的文件。

一旦创建了文件,您就应该将其添加到app/Services/AuthServiceProvider.php中的boot中。

$this->app['authService']->loadHandlers($this->app[\App\Services\Auth\AuthHandlers::class]);

您可以在这里找到处理器实现的示例。

回退

连接器提供通过设置SERVICE_AUTH_ENALBED=false禁用远程服务的能力。这意味着登录、注销、密码重置等身份验证操作将仅本地处理。

与身份验证相关的逻辑

以下应用程序部分应替换为包提供的功能。

  • 注册
  • 登录
  • 密码重置

注册

  • 如果您遵循默认的Laravel用户注册实现,应在App\Http\Controllers\Auth\RegistrationController控制器中将特质Illuminate\Foundation\Auth\RegistersUsers替换为Slides\Connector\Auth\Concerns\RegistersUsers

如果您有自定义注册逻辑,可以覆盖特质的函数。

  • 删除create()方法,因为它由RegistersUsers特质实现。

登录

如果您遵循默认的Laravel用户注册实现,应在App\Http\Controllers\Auth\LoginController控制器中将特质Illuminate\Foundation\Auth\AuthenticatesUsers替换为Slides\Connector\Auth\Concerns\AuthenticatesUsers

如果您有自定义登录逻辑,可以覆盖特质的函数。

密码重置

  • 如果您遵循默认的Laravel用户注册实现,应替换以下文件中的特质
    • App\Http\Controllers\Auth\ForgotPasswordController:将Illuminate\Foundation\Auth\SendsPasswordResetEmails替换为Slides\Connector\Auth\Concerns\SendsPasswordResetEmails
    • App\Http\Controllers\Auth\ResetPasswordController:将Illuminate\Foundation\Auth\ResetsPasswords替换为Slides\Connector\Auth\Concerns\ResetsPasswords

如果您自定义了密码重置逻辑,您可以覆盖特性(trait)的方法。

  • 如果您的 User 模型没有实现 UserHelpers 特性,请在那里定义以下方法
/**
 * Send the password reset notification.
 *
 * @param string $token
 *
 * @return void
 */
public function sendPasswordResetNotification(string $token)
{
    $this->notify(new \Slides\Connector\Auth\Notifications\ResetPasswordNotification($token));
}
  • 通过添加到 routes/web.php 覆盖重置表单路由
Route::get('password/reset/{token}/{email}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');

服务间的共享缓存

配置

步骤 1. 配置 Redis 连接

将以下内容添加到您的 config/database.php

'redis' => 
    ...
    
    'authService' => [
        'host' => env('SERVICE_AUTH_REDIS_HOST', '127.0.0.1'),
        'password' => env('SERVICE_AUTH_REDIS_PASSWORD', null),
        'port' => env('SERVICE_AUTH_REDIS_PORT', 6379),
        'database' => env('SERVICE_AUTH_REDIS_CACHE_DB', 1),
    ]
],
步骤 2. 添加环境变量

添加以下环境变量。请向供应商索取它们的值。

SERVICE_AUTH_REDIS_HOST=
SERVICE_AUTH_REDIS_PASSWORD=
SERVICE_AUTH_REDIS_PORT=
SERVICE_AUTH_REDIS_CACHE_DB=1

使用方法

该功能的背后 API 非常简单,就像您使用 Laravel 的 Cache 门面一样。

全局键值参数

AuthService::cache('the-global-param', 'the-param-value');
AuthService::cache()->set('the-global-param', 'the-param-value');

AuthService::cache('the-global-param'); // the-param-value
AuthService::cache()->get('the-param-param'); // the-global-value

存储/检索对象参数和值。

AuthService::cache()->set('emailing', 'sendOffers', true);
AuthService::cache()->get('emailing', 'sendOffers'); // true

存储/检索与用户相关的参数。

AuthService::userCache($user->retrieveRemoteId(), 'receiveOffers', true);
AuthService::userCache($user->retrieveRemoteId(), 'receiveOffers'); // true

// Get all user's parameters
AuthService::userCache($user->retrieveRemoteId()); // ['receiveOffers' => true]