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\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\RefreshTokenRepository
。RefreshTokenRepository
将在需要时存储和撤销刷新令牌,并检查刷新令牌是否已被撤销。