spie/laravel-jwt

Laravel 和 Lumen 的 JWT 包。

v3.5 2023-03-07 21:43 UTC

README

Build Status Coverage Status StyleCI

此包为 Laravel 提供了一个 JWT 认证 Guard

此包提供了一个访问和刷新令牌的工作流程。您需要首先创建一个访问令牌。使用访问令牌,您可以颁发一个刷新令牌。然后,如果需要,可以使用此刷新令牌创建访问令牌。

要求

安装

只需使用 composer 拉取此包

composer require spie/laravel-jwt

Laravel

SPie\LaravelJWT\Providers\LaravelServiceProvider 添加到 config/app.php 中的 providers 数组。

'providers' => [
    ...
    SPie\LaravelJWT\Providers\LaravelServiceProvider::class
],

Lumen

bootstrap/app.php 中添加 Illuminate\Auth\AuthServiceProviderSPie\LaravelJWT\Providers\LumenServiceProvider

...
    
$app->register(Illuminate\Auth\AuthServiceProvider::class);
    
$app->register(SPie\LaravelJWT\Providers\LumenServiceProvider::class);
    
...

配置

JWT

您可以在您的 .env 文件中配置 JWT 包。您可以在 .env.example 文件中找到可用的配置选项。

JWT_SECRET=
JWT_ISSUER=App
JWT_SIGNER=Lcobucci\JWT\Signer\Hmac\Sha256
JWT_ACCESSS_TOKEN_PROVIDER=SPie\LaravelJWT\TokenProvider\HeaderTokenProvider
JWT_ACCESS_TOKEN_TTL=10
JWT_ACCESS_TOKEN_KEY=Authorization
JWT_BLACKLIST=SPie\LaravelJWT\Blacklist\CacheTokenBlacklist
JWT_REFRESH_TOKEN_PROVIDER=SPie\LaravelJWT\TokenProvider\CookieTokenProvider
JWT_REFRESH_TOKEN_TTL=
JWT_REFRESH_TOKEN_KEY=refresh-token
JWT_REFRESH_TOKEN_REPOSITORY=
JWT_IP_CHECK_ENABLED=

您还可以将仓库中的 config/jwt.php 文件复制到您的项目配置目录,以无需 .env 文件来配置 JWT。

必须为 JWT_SECRET JWT_ISSUER 添加值。 对于其他配置,都有一个默认值。

认证

您需要在您的 config/auth.php 文件中添加对 JWTGuard 的条目。

'guards' => [

    ...
    
    'jwt' => [
        'driver' => 'jwt',
    ],
],

使用

您可以通过依赖注入使用 SPie\LaravelJWT\Auth\JWTGuard,并依赖于 Illuminate\Contracts\Auth\Guard,但您必须在 ServiceProvider 中将 JWTGuard 绑定到 SPie\LaravelJWT\Auth\JWTGuardIlluminate\Contracts\Auth\Guard。您还可以通过使用在 config/auth.php 中配置的守卫名称调用 Illuminate\Auth\AuthManager::guard($name) 来获取 JWTGuard

用户

要使用您的用户模型进行认证,它必须实现 SPie\LaravelJWT\Contracts\JWTAuthenticatable 接口。

登录

要登录,请使用 Illuminate\Contracts\Auth\StatefulGuard 提供的 login 方法。之后,您可以通过 getAccessTokengetRefreshToken 方法获取访问令牌和刷新令牌。

登出

JWTGuard::logout() 方法将取消设置 $jwt$user 属性。如果已配置 TokenBlacklist,则将吊销令牌。如果使用了刷新令牌,则也会吊销。

TokenProvider

您必须指定一个 TokenProvider,以便能够从请求中提取令牌。此包已包含两个 TokenProviderSPie\LaravelJWT\TokenProvider\HeaderTokenProviderSPie\LaravelJWT\TokenProvider\CookieTokenProvider。当然,您也可以创建一个自定义的 TokenProvider,实现 SPie\LaravelJWT\Contracts\TokenProvider 接口,并在 JWT 配置中指定它。您还必须为刷新令牌指定一个 TokenProvider

JWTHandler

要创建或验证 JWT,您可以使用 SPie\LaravelJWT\JWTHandler

创建 JWT

要创建 JWT,您必须提供一个主题和一个可选的有效负载和 Ttl。

/** @var SPie\LaravelJWT\JWT $jwt */
$jwt = $jwtHandler->createJWT('SUBJECT', ['claim1' => 'value1'], );

获取有效的 JWT

要验证 JWT,您必须提供作为字符串的令牌。如果令牌有效,您将获得一个 SPie\LaravelJWT\JWT 对象,否则将获得一个特定的 JWTException

$token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJUZXN0IiwiaWF0IjoxNTQyOTc0NzM3LCJleHAiOjE1NzQ1OTcxMzcsImF1ZCI6IiIsInN1YiI6IlRlc3QifQ.XdS6BiYD02I_1AAFeCxuO3LdeNBXLjE9TWd-G89ePOk';
 
/** @var SPie\LaravelJWT\JWT $jwt */
$jwt = $jwtHandler->getValidJWT($token);

可能的异常有

  • SPie\LaravelJWT\Exceptions\InvalidTokenException
  • SPie\LaravelJWT\Exceptions\InvalidSignatureException
  • SPie\LaravelJWT\Exceptions\TokenExpiredException
  • SPie\LaravelJWT\Exceptions\BeforeValidException

如果设置了 JWT_IP_CHECK_ENABLED 设置,则将比较 IP 地址。如果不匹配,则用户未通过认证。

JWT 对象

SPie\LaravelJWT\JWT 对象只是 Lcobucci\JWT\Token 的包装器。要获取 JWT 的字符串表示,必须调用 JWT::getJWT() 方法。

TokenBlacklist

JWTGuard 可以使用令牌黑名单。令牌黑名单必须实现 SPie\LaravelJWT\Contracts\TokenBlacklist 接口。该接口提供了两个方法:revoke(SPie\LaravelJWT\JWT $jwt)isRevoked(string $jwt)revoke 方法将存储 JWT,直到其过期,如果没有设置过期日期,则永久存储。isRevoked 方法将检查是否存在已撤销的令牌。

RefreshTokenRepository

如果您想使用刷新令牌,必须实现 SPie\LaravelJWT\RefreshTokenRepositoryRefreshTokenRepository 将在需要时存储和撤销刷新令牌,并检查刷新令牌是否已被撤销。