使用tymondesigns/jwt-auth快速实现Laravel API认证

使用tymondesigns/jwt-auth快速实现Laravel API认证

jwt-auth tymon/jwt-auth: 是一个基于 JWT 的认证和授权库,支持多种认证方式和存储驱动。该项目提供了一个简单易用的认证和授权库,可以方便地实现用户的认证和授权,同时支持多种认证方式和存储驱动。 jwt-auth 项目地址: https://gitcode.com/gh_mirrors/jw/jwt-auth

在现代Web开发中,JSON Web Token (JWT)已成为API认证的主流方案之一。本文将详细介绍如何在Laravel应用中快速集成tymondesigns/jwt-auth包来实现基于JWT的认证系统。

准备工作

在开始之前,请确保已经按照官方文档完成了包的安装配置。本文假设你已经在Laravel或Lumen环境中正确安装了该包。

用户模型改造

首先需要对User模型进行改造,使其支持JWT认证:

<?php

namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    // 其他代码省略...

    /**
     * 获取JWT标识符
     * 通常是用户主键
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * 返回自定义的JWT声明
     * 可以在这里添加额外的用户信息到token中
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

getJWTIdentifier()方法返回用户的唯一标识,通常是数据库主键。getJWTCustomClaims()方法允许你向token中添加自定义数据,如用户角色等。

配置认证守卫

接下来需要配置Laravel的认证系统使用JWT驱动:

// config/auth.php
'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

这里我们将默认守卫设置为'api',并使用'jwt'作为驱动。这样配置后,Laravel的认证系统就会在背后使用JWT来处理认证逻辑。

实现认证路由

创建API路由来处理认证相关请求:

// routes/api.php
Route::group([
    'middleware' => 'api',
    'prefix' => 'auth'
], function ($router) {
    Route::post('login', 'AuthController@login');
    Route::post('logout', 'AuthController@logout');
    Route::post('refresh', 'AuthController@refresh');
    Route::post('me', 'AuthController@me');
});

这些路由提供了完整的认证流程:

  • login: 用户登录获取token
  • logout: 注销当前token
  • refresh: 刷新即将过期的token
  • me: 获取当前认证用户信息

创建认证控制器

生成AuthController并实现认证逻辑:

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

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

        if (! $token = auth()->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }

    public function me()
    {
        return response()->json(auth()->user());
    }

    public function logout()
    {
        auth()->logout();
        return response()->json(['message' => 'Successfully logged out']);
    }

    public function refresh()
    {
        return $this->respondWithToken(auth()->refresh());
    }

    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}

控制器中的关键点:

  1. 构造函数中设置中间件,只有login方法不需要认证
  2. login方法验证用户凭证并返回token
  3. me方法返回当前认证用户信息
  4. logout方法使当前token失效
  5. refresh方法刷新token有效期
  6. respondWithToken方法统一格式化token响应

测试认证流程

完成上述步骤后,你可以向/auth/login发送POST请求测试登录:

{
    "email": "your@email.com",
    "password": "yourpassword"
}

成功后将返回类似响应:

{
    "access_token": "eyJhbGciOiJIUzI1NiIs...",
    "token_type": "bearer",
    "expires_in": 3600
}

使用Token访问受保护路由

获取token后,可以通过以下方式在请求中携带token:

  1. Authorization头(推荐方式):

    Authorization: Bearer your.token.here
    
  2. 查询参数

    GET /api/protected?token=your.token.here
    
  3. POST参数:在POST请求体中发送token

  4. Cookie:将token存储在cookie中

  5. Laravel路由参数:在路由中包含token

最佳实践建议

  1. 始终使用HTTPS传输token
  2. 设置合理的token过期时间
  3. 考虑实现token黑名单机制
  4. getJWTCustomClaims()中添加必要的用户信息,减少数据库查询
  5. 为敏感操作实现二次验证

通过以上步骤,你已经成功在Laravel应用中实现了基于JWT的认证系统。这套方案简洁高效,非常适合现代API开发。

jwt-auth tymon/jwt-auth: 是一个基于 JWT 的认证和授权库,支持多种认证方式和存储驱动。该项目提供了一个简单易用的认证和授权库,可以方便地实现用户的认证和授权,同时支持多种认证方式和存储驱动。 jwt-auth 项目地址: https://gitcode.com/gh_mirrors/jw/jwt-auth

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平钰垚Zebediah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值