jijihohococo / ichi-api-authentication
laravel 的 API 认证
Requires
- php: ^7.2|^8.0
This package is auto-updated.
Last update: 2024-09-29 05:49:55 UTC
README
由于我在使用 Laravel Passport 时遇到了 PHP 版本和 League Oauth2 库冲突的问题,因此产生了开发自己的 API 认证驱动程序的想法。这个 API 认证库是在不使用 Oauth2 的情况下开发的。这也是我第一次进行库的开发。其使用和库结构真的与 Laravel Passport 的结构相同。目的是在 Laravel API 开发中使用多个 API 认证守卫,而不会遇到我上面提到的问题。开发框架耗时一周。
此库可用于 Laravel 版本 5.6 到 8,以及 PHP 版本 7.0 及以上
许可证
根据MIT 许可证,此软件包为开源
安装库
composer require jijihohococo/ichi-api-authentication:dev-master
使用前
要使用此库,您的用户表中需要包含 "id"、"email" 和 "password" 列。
使用库
要使用此库,首先需要在您的 Laravel 项目的 "config/auth.php" 文件中按照以下代码分配守卫。
'guards' => [ 'user_api' => [ 'driver' => 'ichi', 'provider' => 'users', 'hash' => false, ], ]
然后,我们需要在终端中通过以下代码将用户 API 守卫添加到 Ichi API 数据库中。
php artisan ichi:client --password
在终端中选择正确的用户守卫,如您在 "config/auth.php" 的守卫数组中提到的,您的用户模型需要通过以下方式继承此库的功能。
namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use JiJiHoHoCoCo\IchiApiAuthentication\HasApi; class User extends Authenticatable{ use HasApi; }
配置已完成,您可以使用以下命令行覆盖 Ichi 库的数据库模型。
php artisan vendor:publish --tag=ichi-migrations
您还可以使用以下命令行覆盖 Ichi 库的配置。
php artisan vendor:publish --tag=ichi-config
您可以按照以下方式测试您的令牌的注册。
$user= User::create([ 'name' => 'jiji' , 'email' => 'ji@gmail.com' , 'password' => Hash::make( 'password' ) ]); $token=$user->ichiToken(); return response()->json([ 'name' => $user->name , 'token' => $token->token , 'expired_at' => $token->expired_at , 'refresh_token' => $token->refreshToken , 'refreshTokenExpiredTime' => $token->refreshTokenExpiredTime ]);
您可以按照以下方式测试您的令牌的登录。
要在登录操作中,您需要在头部中设置 Accept => application/json 和 Authorization => Bearer {token}。Route::group(['middleware' => ['auth:user_api']], function() { Route::get('user_profile',function(){ $user=\Auth::guard('user_api')->user(); dd($user->name); }); });
您可以按照以下方式撤销登录令牌。
Route::group(['middleware' => ['auth:user_api']], function() { Route::get('user_logout',function(){ $user=\Auth::guard('user_api')->user(); $user->revoke(); return response()->json([ 'message' => 'Log out successfully' ]); });
令牌的默认过期时间为 1 年。您可以在 "app/Providers/AuthServiceProvider.php" 中按照以下方式自定义过期时间。
Gate 与我们的库没有连接。
namespace App\Providers; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; use JiJiHoHoCoCo\IchiApiAuthentication\Ichi; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ // 'App\Models\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Ichi::setExpiredAt(now()->addDays(2)); }
您可以通过以下方式选择选定用户的全部令牌。
User::findOrFail(1)->getAllTokens();
您可以在命令行中按照以下方式删除已撤销的令牌。
php artisan ichi:remove --revoke
您可以在命令行中按照以下方式删除过期的令牌。
php artisan ichi:remove --expired
刷新令牌
您可以在认证路由外通过以下方式刷新令牌:头部 Accept => application/json 和 refresh_token => Bearer {refreshToken}。当您的令牌过期时,登录时必须刷新令牌。
Route::get('refresh_user_token',function(){ $user=new User; $refreshToken=$user->refreshToken(); return response()->json([ 'name' => $refreshToken->user->name , 'token' => $refreshToken->token , 'expired_at' => $refreshToken->expired_at , 'refresh_token' => $refreshToken->refreshToken , 'refreshTokenExpiredTime' => $refreshToken->refreshTokenExpiredTime ]); });
刷新令牌的默认过期时间为 1 年。您可以在 "app/Providers/AuthServiceProvider.php" 中按照以下方式自定义过期时间。
Gate 与我们的库没有连接。
namespace App\Providers; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Gate; use JiJiHoHoCoCo\IchiApiAuthentication\Ichi; class AuthServiceProvider extends ServiceProvider { /** * The policy mappings for the application. * * @var array */ protected $policies = [ // 'App\Models\Model' => 'App\Policies\ModelPolicy', ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Ichi::setRefreshExpiredAt(now()->addDays(2)); }
撤销其他令牌
您可以通过以下方式使其他设备注销:头部 Accept => application/json 和 Authroization => Bearer {token}(该令牌不会被撤销)。
Route::group(['middleware' => ['auth:user_api']], function() { Route::get('revoke_other_token',function(){ $user=\Auth::guard('user_api')->user(); $user->logOutOtherTokens(); return response()->json([ 'message' => 'Logout other devices success' ]); }); });
您可以获取每个用户的撤销令牌数量。
User::findOrFail(1)->revokedTokens();