您的位置:

tymon/jwt-auth详解

一、背景

tymon/jwt-auth是一个基于JWT认证和Laravel框架而开发的PHP库,验证JWT令牌并通过Eloquent ORM提供对数据库支持。 JWT是在应用程序中生成,签名,并将其用作用户或客户端的身份验证标识符的 JSON 负载。

二、使用

tymon/jwt-auth是一个易于安装和使用的库,它可以轻松地为您的Laravel应用程序提供JWT认证。您需要先在您的 Laravel 应用程序中安装 tymon/jwt-auth 包,使用 Composer,以便可以轻松应用 JWT 认证。

三、安装


composer require tymon/jwt-auth
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
php artisan jwt:secret

在 config/auth.php 配置文件中配置 guards 和 providers


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

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ]
],

确保在您的 User 模型中包含 JWTSubject 受到支持的接口,以便在生成JWT令牌时包括正确的所有信息。


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

class User extends Authenticatable implements JWTSubject
{
    // ...

    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    public function getJWTCustomClaims()
    {
        return [];
    }
}

四、认证

在jwt-auth中,认证过程主要分为两部分:生成JWT令牌和验证JWT令牌。

1、生成JWT令牌

Successful authentication will return a token string that should be sent to the client alongside their authenticated user data. This token can be used to authenticate subsequent requests to any part of your application that requires authentication.


only(['email', 'password']);
        if (!$token = Auth::attempt($credentials)) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }
        return $this->respondWithToken($token);
    }

    /**
     * 返回JWT token
     * 
     * @param string $token
     * 
     * @return \Illuminate\Http\JsonResponse
     * 
     */
    protected function respondWithToken($token)
    {
        return response()->json([
            'access_token' => $token,
            'token_type' => 'bearer',
            'expires_in' => auth()->factory()->getTTL() * 60
        ]);
    }
}  
?>

2、验证JWT令牌

JWT tokens sent with requests to your application should be included in the Authorization header using the Bearer authentication scheme.


json(['users' => $users]);
    }
}  
?>

五、更多功能

1、自定义响应

可以使用JWT-auth自定义响应,只需在 config/jwt.php 配置文件中添加以下内容:


'custom' => [
    'claim_to_return' => 'value_to_return',
    'user_object' => 'App\\User',
    'some_value' => 'some_value',
],

发出响应时,JWT-auth将发布此对象:


{'some_value': 'some_value', 'claim_to_return': 'value_to_return', 'user_object': { ... }}

2、更新令牌


public function refresh() {
    $token = JWTAuth::getToken();

    try {
        $token = JWTAuth::refresh($token);
    } catch (TokenExpiredException $e) {
        throw new HttpResponseException(response()->json([
            'token_expired'
        ], $e->getStatusCode()));
    } catch (JWTException $e) {
        throw new HttpResponseException(response()->json([
            'token_invalid'
        ], $e->getStatusCode()));
    }

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

3、各平台的Token格式


JWTAuth::fromUser($user, [
    'platform' => 'ios'
])

总结

通过学习tymon/jwt-auth和JWT认证,我们可以轻松实现Laravel API应用程序的身份验证,确保在您的API应用程序中使用保护的路由时,用户必须登录并提供正确的凭据。