bluemill / jwt-artisan
Laravel和Lumen的JWT认证包
Requires
- firebase/php-jwt: ^3.0
- illuminate/http: ^5.1
- illuminate/support: ^5.1
Requires (Dev)
- phpspec/phpspec: ^2.3
This package is not auto-updated.
Last update: 2024-09-21 09:51:49 UTC
README
注意:从https://github.com/generationtux/jwt-artisan分支而来,并更新以支持Laravel >= 6和PHP >= 7.2
Laravel和Lumen网络工匠的令牌认证
JWT是认证API请求之间各种服务的一个很好的解决方案。此包使Laravel和Lumen都能轻松地使用JWT。
为什么使用JWT?
因为你有
需要相互认证,以便可以拒绝不良请求,如
这就是为什么JWT让你感觉像
内容
设置
使用composer安装包
$ composer require generationtux/jwt-artisan
添加Laravel/Lumen的相应服务提供者
// Laravel // config/app.php 'providers' => [ ... GenTux\Jwt\Support\LaravelServiceProvider::class, ] // Lumen // bootstrap/app.php $app->register(GenTux\Jwt\Support\LumenServiceProvider::class);
配置
此包的所有配置都可以使用环境变量设置。使用环境变量的原因是为了能够尽可能容易地将Laravel和Lumen集成在一起。请参阅下表以获取可用的配置选项及其默认值。
如果您正在使用JwtExceptionHandler
来处理异常,则可以将这些环境变量设置为自定义错误消息。 (有关使用异常处理程序的信息,请参阅下文)
与令牌一起工作
创建令牌
将GenTux\Jwt\JwtToken
实例注入到您的控制器或其他服务中,以创建新令牌。
<?php use GenTux\Jwt\JwtToken; class TokensController extends controller { public function create(JwtToken $jwt) { $payload = ['exp' => time() + 7200]; // expire in 2 hours $token = $jwt->createToken($payload); // new instance of JwtToken return (string) $token; } }
实现GenTux\Jwt\JwtPayloadInterface
,以便将其他对象传递给createToken
以获得更动态的有效载荷。
<?php use GenTux\Jwt\JwtPayloadInterface; class User extends Model implements JwtPayloadInterface { public function getPayload() { return [ 'sub' => $this->id, 'exp' => time() + 7200, 'context' => [ 'email' => $this->email ] ]; } }
然后在创建令牌时简单地传递该对象
<?php use GenTux\Jwt\JwtToken; class TokensController extends controller { public function create(JwtToken $jwt) { $user = User::find(1); $token = $jwt->createToken($user); return $token->payload(); // ['sub' => 1, exp => '...', 'context' => ...] } }
如果需要,您可以设置特定的secret
和algorithm
public function create(JwtToken $jwt) { return $jwt ->setSecret('secret_123') ->setAlgorithm('custom') ->createToken('[...]'); }
验证令牌
使用提供的中间件验证带有JWT令牌的请求是最简单的方法。
<?php // Laravel Route::group(['middleware' => 'jwt'], function() { Route::post('/foo', 'FooController'); }); // Lumen $app->group(['middleware' => 'jwt', 'namespace' => 'App\Http\Controllers'], function($app) { $app->post('/foo', 'FooController'); });
如果令牌无效,将抛出GenTux\Jwt\Exceptions\InvalidTokenException
。如果没有提供令牌,则将抛出GenTux\Jwt\Exceptions\NoTokenException
。
要手动验证令牌,您可以使用具有GenTux\Jwt\GetsJwtToken
特质的任何类来获取令牌。
例如,在Laravel请求对象中
<?php use GenTux\Jwt\GetsJwtToken; class CreateUser extends FormRequest { use GetsJwtToken; public function authorize() { return $this->jwtToken()->validate(); } }
或在Lumen的控制器中
<?php use GenTux\Jwt\GetsJwtController; class FooController extends controller { use GetsJwtToken; public function store() { if( ! $this->jwtToken()->validate()) { return redirect('/nope'); } ... } }
有效载荷
一旦您有了令牌,处理有效载荷就很容易。
<?php use GenTux\Jwt\GetsJwtToken; class TokenService { use GetsJwtToken; public function getExpires() { $payload = $this->jwtPayload(); // shortcut for $this->jwtToken()->payload() return $payload['exp']; } }
JwtToken的payload
方法接受一个path
,可以用来从有效载荷中获取特定数据。
<?php use GenTux\Jwt\GetsJwtToken; class TokenService { use GetsJwtToken; public function getData() { // ['exp' => '123', 'context' => ['foo' => 'bar']] $token = $this->jwtToken(); $token->payload('exp'); // 123 $token->payload('context.foo'); // bar $token->payload('context.baz'); // null } }
处理错误
如果需要,此包可以开箱即用地处理JWT异常。它将处理所有JWT异常并返回JSON错误响应。如果您想实现自己的错误处理,可以查看GenTux\Jwt\Exceptions\JwtExceptionHandler
作为示例。
要实现,请将以下内容添加到app/Exceptions/Handler.php
内部
<?php use GenTux\Jwt\Exceptions\JwtException; use GenTux\Jwt\Exceptions\JwtExceptionHandler; class Handler extends ExceptionHandler { use JwtExceptionHandler; public function render($request, Exception $e) { if($e instanceof JwtException) return $this->handleJwtException($e); ... } }