spie / laravel-jwt
Laravel 和 Lumen 的 JWT 包。
Requires
- php: >=7.4.0
- illuminate/auth: >=7.0
- illuminate/cache: >=7.0
- illuminate/config: >=7.0
- illuminate/console: >=7.0
- illuminate/contracts: >=7.0
- illuminate/support: >=7.0
- lcobucci/jwt: ^4.0
- nesbot/carbon: ^2.0
- vlucas/phpdotenv: ^4.0 || ^5.2
Requires (Dev)
- fakerphp/faker: ^1.19
- mockery/mockery: ^1.2
- php-coveralls/php-coveralls: ^2.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: ^0.12.90
- phpstan/phpstan-deprecation-rules: ^0.12.6
- phpunit/phpunit: ^9.0
README
此包为 Laravel 提供了一个 JWT 认证 Guard。
此包提供了一个访问和刷新令牌的工作流程。您需要首先创建一个访问令牌。使用访问令牌,您可以颁发一个刷新令牌。然后,如果需要,可以使用此刷新令牌创建访问令牌。
要求
- PHP >= 7.4
- Laravel 组件 >= 7
- lcobucci/jwt ^3.2
安装
只需使用 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\AuthServiceProvider 和 SPie\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\JWTGuard 和 Illuminate\Contracts\Auth\Guard。您还可以通过使用在 config/auth.php 中配置的守卫名称调用 Illuminate\Auth\AuthManager::guard($name) 来获取 JWTGuard。
用户
要使用您的用户模型进行认证,它必须实现 SPie\LaravelJWT\Contracts\JWTAuthenticatable 接口。
登录
要登录,请使用 Illuminate\Contracts\Auth\StatefulGuard 提供的 login 方法。之后,您可以通过 getAccessToken 和 getRefreshToken 方法获取访问令牌和刷新令牌。
登出
JWTGuard::logout() 方法将取消设置 $jwt 和 $user 属性。如果已配置 TokenBlacklist,则将吊销令牌。如果使用了刷新令牌,则也会吊销。
TokenProvider
您必须指定一个 TokenProvider,以便能够从请求中提取令牌。此包已包含两个 TokenProvider:SPie\LaravelJWT\TokenProvider\HeaderTokenProvider 和 SPie\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\InvalidTokenExceptionSPie\LaravelJWT\Exceptions\InvalidSignatureExceptionSPie\LaravelJWT\Exceptions\TokenExpiredExceptionSPie\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\RefreshTokenRepository。RefreshTokenRepository 将在需要时存储和撤销刷新令牌,并检查刷新令牌是否已被撤销。