Laravel 9 基于自定义令牌的 Api 身份验证教程

Laravel 9 基于自定义令牌的 Api 身份验证教程

在这个 Laravel api 身份验证教程中,我将向您展示 laravel 自定义 api 身份验证示例。我们可以很容易地使用 Laravel passport 或 JWT 创建 api 身份验证。但在这个示例中,我将向您展示使用自定义令牌创建 api 身份验证示例的方法,而无需使用passport 和 jwt。

所以希望,从本教程中,您将学习如何创建 laravel api 身份验证令牌教程。因此,如果您不知道如何创建基于令牌的 api 身份验证,那么此示例适合您。我将使用 Laravel 9 新应用程序来创建这个 Laravel 9 令牌 api 身份验证示例。

所以在这个 laravel 令牌认证中,我将向你展示使用自定义认证的login,register和logout系统。那么让我们看看如何创建基于 Laravel 9 自定义令牌的 api 身份验证示例。

第 1 步:安装 Laravel

composer create-project --prefer-dist laravel/laravel ApiAuth

第 2 步:修改 Auth.php

由于我们要创建一个没有护照或 jwt 的基于自定义令牌的 API 身份验证示例,我们需要配置 auth.php 文件,如下所示:

配置/auth.php

'guards' => [
    'web' => [
            'driver' => 'session',
            'provider' => 'users',
   ],
     'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
   ],
],

第 3 步:创建迁移

在这一步中,我们需要更新users表和User模型来创建 API 令牌认证。所以更新如下:

app/Models/User.php

namespace App\Models;

use App\Helper\Tokenable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, Tokenable;

    protected $fillable = [
        'name',
        'email',
        'password',
        'image'
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    public function saveUser($request) : self
    {   
        $this->name = $request->name;
        $this->email = $request->email;
        $this->password = bcrypt($request->password);
        $this->save();
        
        return $this;
    }

}

And now update the database like:

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('api_token')->nullable();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('users');
    }
};

现在运行php artisan migrate命令来更新迁移。

第 4 步:创建可标记的特征

现在我们必须创建一个自定义可标记特征来生成自定义 api_token 用于用户 api 身份验证。所以像下面这样创建它:

app\Helper\Tokenable.php

namespace App\Helper;

use Illuminate\Support\Str;

Trait Tokenable 
{
    public function generateAndSaveApiAuthToken()
    {
        $token = Str::random(60);

        $this->api_token = $token;
        $this->save();

        return $this;
    }
}

第 5 步:创建路由

现在在这一步中,我们必须为基于自定义令牌的 api 身份验证示例创建 api 路由。所以像这样创建它:

routes/api.php

use App\Http\Controllers\AuthController;
use Illuminate\Support\Facades\Route;

Route::post('register',[AuthController::class,'register']);
Route::post('login',[AuthController::class,'login']);

Route::group(['middleware' => ['auth:api']], function () {
    Route::post('logout', [AuthController::class, 'logout']);
});

第 6 步:创建控制器

现在在最后一步,我们必须创建 AuthController 来完成登录、注册和注销等方法。

app\Http\Controllers\AuthController.php

namespace App\Http\Controllers;

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class AuthController extends Controller
{
    public function register(Request $request, User $user)
    {
        return $user->saveUser($request)
            ->generateAndSaveApiAuthToken();
    }

    public function login(Request $request)
    {
        $credentials = [
            'email' => $request->email,
            'password' => $request->password,
        ];

        if (Auth::guard('web')->attempt($credentials)) {
            $user = Auth::guard('web')
                        ->user()
                        ->generateAndSaveApiAuthToken();

            return $user;
        }

        return response()->json(['message' => 'Error.....'], 401);
    }

    public function logout(Request $request)
    {
        $user = Auth::guard('api')->user();

        if ($user) {
            $user->api_token = null;
            $user->save();
        }

        return response()->json(['Success' => 'Logged out'], 200);
    }
}

一切都准备好了。现在运行php artisan serve命令并测试我们的 api,如下所示:

注册

http://127.0.0.1:8000/api/register

如下输出:

登录

http://127.0.0.1:8000/api/login

注销

http://127.0.0.1:8000/api/logout

希望这篇 Laravel 令牌 api 认证教程对你有所帮助。

Loading...