assin / php-auth
此包的最新版本(v1.0.0)没有可用的许可证信息。
v1.0.0
2020-06-21 08:09 UTC
Requires
- php: >=7.1
- ext-json: *
- lcobucci/jwt: ^3.3
Requires (Dev)
- mockery/mockery: ^1.3.1
- phpunit/phpunit: ^8.5
This package is auto-updated.
Last update: 2024-09-21 20:33:28 UTC
README
一个用于处理PHP中用户身份验证的简单包。
特性列表
- 注册自定义驱动程序以处理身份验证
- 通过定义中间件在调用身份验证方法之前检查请求
安装
使用composer管理您的依赖关系并下载PHPAuth
composer require assin/php-auth
用法
- 创建实现DriverInterface接口的驱动程序。
<?php require 'vendor/autoload.php'; class SimpleDriver implements \Assin\PHPAuth\Contracts\DriverInterface { public function login(\Assin\PHPAuth\ObjectValue\Input $input) { if($input->get('username') === 'test' && $input->get('password') === 'test'){ return 'Success!'; } return 'Failed!'; } }
- 将驱动程序注册到DriverBuilder。
$driver = new SimpleDriver(); $driverId = 1; $driverBuilder = new \Assin\PHPAuth\Builder\DriverBuilder([ $driverId=>$driver ]);
- 初始化请求数据。
$input = new \Assin\PHPAuth\ObjectValue\Input([ 'username'=>'test', 'password'=>'test' ]);
- 配置身份验证类。
$auth = new \Assin\PHPAuth\Auth($driverBuilder); print_r($auth->login($driverId, $input));
完整示例 1
<?php require 'vendor/autoload.php'; class SimpleDriver implements \Assin\PHPAuth\Contracts\DriverInterface { public function login(\Assin\PHPAuth\ObjectValue\Input $input) { if($input->get('username') === 'test' && $input->get('password') === 'test'){ return 'Success!'; } return 'Failed!'; } } $driver = new SimpleDriver(); $driverId = 1; $driverBuilder = new \Assin\PHPAuth\Builder\DriverBuilder([ $driverId=>$driver ]); $input = new \Assin\PHPAuth\ObjectValue\Input([ 'username'=>'test', 'password'=>'test' ]); $auth = new \Assin\PHPAuth\Auth($driverBuilder); print_r($auth->login($driverId, $input)); ?>
注意:您可以根据业务请求注册多个驱动程序并更改身份验证行为!
多个驱动程序示例 2
<?php require 'vendor/autoload.php'; class SimpleDriver implements \Assin\PHPAuth\Contracts\DriverInterface { public function login(\Assin\PHPAuth\ObjectValue\Input $input) { if($input->get('username') === 'test' && $input->get('password') === 'test'){ return 'Successful!'; } return 'Failed!'; } } class SimpleDriver2 implements \Assin\PHPAuth\Contracts\DriverInterface { public function login(\Assin\PHPAuth\ObjectValue\Input $input) { if($input->get('username') === 'test' && $input->get('password') === 'test'){ return ['status'=>true, 'message'=>'Successful!']; } return ['status'=>false, 'message'=>'Failed!']; } } $driverBuilder = new \Assin\PHPAuth\Builder\DriverBuilder([ 1=>new SimpleDriver(), 2=>new SimpleDriver2() ]); $input = new \Assin\PHPAuth\ObjectValue\Input([ 'username'=>'test', 'password'=>'test' ]); $auth = new \Assin\PHPAuth\Auth($driverBuilder); //Print driver 1 respond print_r($auth->login(1, $input)); print PHP_EOL; //Print driver 2 respond print_r($auth->login(2, $input));
中间件示例
- 创建简单的中间件。
Class SimpleMiddleware implements \Assin\PHPAuth\Contracts\MiddlewareInterface{ public function handle(\Assin\PHPAuth\ObjectValue\Input $input, \Closure $next) { if($input->get('username') === 'test'){ throw new Exception('The user is banned'); } $next($input); } }
- 将中间件注册到middleware/kernel并调用登录。
$auth = new \Assin\PHPAuth\Auth($driverBuilder, new \Assin\PHPAuth\Middleware\Kernel([ new SimpleMiddleware() ])); try { print_r($auth->login(1, $input)); }catch (\Exception $exception){ print $exception->getMessage(); }
JWT驱动程序
JWT驱动程序使用lcobucci/jwt包通过Authorization头部参数进行身份验证。我们必须实现一些接口来使用此驱动程序。
实现UserRepositoryInterface类此接口查找用户并返回一个实现UserInterface的对象。
<?php use Assin\PHPAuth\Auth; use Assin\PHPAuth\Builder\DriverBuilder; use Assin\PHPAuth\Config\Config; use Assin\PHPAuth\Contracts\UserInterface; use Assin\PHPAuth\Contracts\UserRepositoryInterface; use Assin\PHPAuth\Drivers\JWT\Config as JWTConfig; use Assin\PHPAuth\Drivers\JWT\JWTDriver; use Assin\PHPAuth\Drivers\JWT\Response; use Assin\PHPAuth\ObjectValue\Input; require 'vendor/autoload.php'; class SimpleUserRepository implements UserRepositoryInterface { public function findForLogin(Input $input) : UserInterface{ $userId = $input->get('username')=='1234' && $input->get('password')=='1234' ? 1 : 0; return new \Assin\PHPAuth\Drivers\JWT\User($userId); } public function findForForgetPassword(Input $input) : UserInterface{ $userId = $input->get('username')=='1234' ? 1 : 0; return new \Assin\PHPAuth\Drivers\JWT\User($userId); } } $userRepository = new SimpleUserRepository(); $driverId = Config::DRIVER_JWT; $JWTDriver = new JWTDriver(new JWTConfig(), $userRepository); $driverBuilder = new DriverBuilder([$driverId => $JWTDriver]); $input = new Input(['username'=>'1234', 'password'=>'1234']); /** @var Response $response */ $response = (new Auth($driverBuilder))->login($driverId, $input); $token = $response->getData()['token']; print_r($token);
JWT驱动程序 - 创建访客令牌
<?php require 'vendor/autoload.php'; $JWTDriver = new \Assin\PHPAuth\Drivers\JWT\JWTDriver(); $token = $JWTDriver->createToken(); print_r($JWTDriver->plainToken($token, true));
JWT驱动程序 - 刷新令牌
<?php require 'vendor/autoload.php'; $oldToken = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJqdGkiOiI0ZjFnMjNhMTJhYSIsImlhdCI6MTU5MjExNDczMywiZXhwIjoxNTkyMTE4MzMzLCJ1c2VyX2luZm8iOnsiaWQiOjF9fQ.gLhkKVtSjx5pDLX973grZ94CHKv5gsYw99sfeX5XzQs'; $JWTDriver = new \Assin\PHPAuth\Drivers\JWT\JWTDriver(); $token = $JWTDriver->parseToTokenObject($oldToken); $newToken = $JWTDriver->refreshToken($token); print_r($JWTDriver->plainToken($newToken, true));