jijihohococo/ichi-api-authentication

dev-master 2021-08-02 09:11 UTC

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();

希望您喜欢!