unisharp / laravel-jwt
基于 jwt-auth 包的 jwt 包,用于重新发行令牌。
Requires
- php: ^5.6.4 || ^7.0
- illuminate/support: >=5.0.0
- tymon/jwt-auth: 1.0.0-rc.2
Requires (Dev)
- mockery/mockery: ~1.0
- phpunit/phpunit: ^6.1
README
方法
如果你在项目中选择 Tymon JWTAuth
作为 jwt 解决方案,当你尝试刷新令牌时,该包将使你交换的令牌列入黑名单(假设你的黑名单功能已启用)。所以当你的客户端面对并发使用情况时,你的请求可能会被拒绝,因为该请求是在你的应用程序更新由服务器返回的 jwt 令牌之前发送的。此包在短时间内缓存刷新的 jwt 令牌,以确保即使并发情况下客户端请求带有旧令牌,也能得到正确的响应。
重要变更
我们将命名空间 Unisharp\JWT 更改为 UniSharp\JWT
安装
- 通过 Composer
composer require unisharp/laravel-jwt
- 添加服务提供者
Tymon\JWTAuth\Providers\LaravelServiceProvider::class, UniSharp\JWT\JWTServiceProvider::class,
在 Lumen 中,请使用
Tymon\JWTAuth\Providers\LumenServiceProvider::class,
接下来,也在 app.php 配置文件中,在别名数组下,你可能想添加 JWTAuth 面板。
'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth',
'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
最后,你将想要使用以下命令发布配置
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
php artisan vendor:publish --provider="UniSharp\JWT\JWTServiceProvider"
别忘了在配置文件中设置一个密钥!
$ php artisan jwt:secret
这将生成一个新的随机密钥,该密钥将用于签名你的令牌。
然后你就完成了!
用法
打开你的 config/auth.php
配置文件,在你的任何守卫下的驱动程序中,只需添加 jwt-auth
作为你的驱动程序,然后你就设置好了。确保你还为守卫设置了 provider
以与数据库通信。
设置守卫驱动程序
// config/auth.php 'guards' => [ 'api' => [ 'driver' => 'jwt-auth', 'provider' => 'users' ], // ... ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], ],
中间件使用
保护路由的中间件
Route::get('api/content', ['middleware' => 'laravel.jwt', 'uses' => 'ContentController@content']);
保护控制器的中间件
<?php namespace App\Http\Controllers; class ContentController extends Controller { public function __construct() { $this->middleware('laravel.jwt'); } }
此中间件将自动刷新已过期的 jwt 令牌。新的刷新 jwt 令牌将携带到响应头:
Ahthorization
。客户端需要用新的令牌替换你过期的 jwt 令牌。
注意:以上示例假设你已如上文中“设置守卫驱动程序”部分所述,在 config/auth.php
文件中设置了一个名为 api
的守卫,其驱动程序为 jwt-auth
。
以下使用示例假设你已将默认的守卫设置为使用
jwt-auth
驱动程序的守卫。你还可以在调用任何方法之前显式定义守卫,只需在前面加上
Auth::guard('api')
。示例:
Auth::guard('api')->user()
尝试认证并返回令牌
// This will attempt to authenticate the user using the credentials passed and returns a JWT Auth Token for subsequent requests. $token = Auth::attempt(['email' => 'user@domain.com', 'password' => '123456']);
通过 ID 一次性认证
if(Auth::onceUsingId(1)) { // Do something with the authenticated user }
通过凭据一次性认证
if(Auth::once(['email' => 'user@domain.com', 'password' => '123456'])) { // Do something with the authenticated user }
验证凭据
if(Auth::validate(['email' => 'user@domain.com', 'password' => '123456'])) { // Credentials are valid }
检查用户是否已认证
if(Auth::check()) { // User is authenticated }
检查用户是否为访客
if(Auth::guest()) { // Welcome guests! }
注销已认证用户
Auth::logout(); // This will invalidate the current token and unset user/token values.
通过 ID 生成 JWT 认证令牌
$token = Auth::generateTokenById(1); echo $token;
获取已认证用户
一旦用户通过中间件进行认证,您可以通过以下方式访问其详细信息:
$user = Auth::user();
您还可以使用令牌本身手动访问用户信息
$user = Auth::setToken('YourJWTAuthToken')->user();
获取已认证用户的 ID
$userId = Auth::id();
刷新过期令牌
虽然建议使用包中提供的中间件来刷新,但如果你愿意,你也可以使用此方法手动刷新。
刷新请求中传递的过期令牌
$token = Auth::refresh();
刷新传递的过期令牌
Auth::setToken('ExpiredToken')->refresh();
使令牌无效
使请求中传递的令牌无效
$forceForever = false; Auth::invalidate($forceForever);
通过手动设置使令牌无效
$forceForever = false; Auth::setToken('TokenToInvalidate')->invalidate($forceForever);
获取令牌
$token = Auth::getToken(); // Returns current token passed in request.
获取令牌有效载荷
此方法将解码令牌并返回其原始有效载荷。
获取请求中传入的令牌的有效载荷
$payload = Auth::getPayload();
手动获取指定令牌的有效载荷
$payload = Auth::setToken('TokenToGetPayload')->getPayload();