ronakgolakiya / jwt-auth-artisan
Laravel和Lumen的JWT身份验证包
Requires
- firebase/php-jwt: ^6.4
- illuminate/http: ^9.52
- illuminate/support: ^9.52
Requires (Dev)
- phpspec/phpspec: ^7.3
This package is auto-updated.
Last update: 2024-09-28 16:25:59 UTC
README
Laravel和Lumen网络工匠的Token身份验证
JWT 是一种在各个服务之间验证API请求的绝佳解决方案。此包使 Laravel 和 Lumen 非常容易地使用 JWT。
为什么选择 JWT?
因为你有
这些需要相互验证以拒绝不良请求的需求
这就是为什么 JWT 让你感觉像
内容
设置
使用composer安装包
$ composer require ronakgolakiya/jwt-auth-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
来处理异常,可以将以下环境变量设置为自定义错误消息。 (有关使用异常处理器的信息,请参阅以下内容)
处理Token
创建Token
将 GenTux\Jwt\JwtToken
的实例注入到您的控制器或其他服务中,以创建新的Token。
<?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, ], ]; } }
然后在创建Token时简单传递该对象
<?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('[...]'); }
验证Token
验证JWT Token请求的最简单方法就是使用提供的中间件。
<?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"); } );
当Token无效时,将抛出 GenTux\Jwt\Exceptions\InvalidTokenException
。如果没有提供Token,则抛出 GenTux\Jwt\Exceptions\NoTokenException
。
要手动验证Token,您可以使用具有 GenTux\Jwt\GetsJwtToken
特性的任何类来获取Token。
例如,在 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'); } ... } }
负载
一旦您有了Token,处理负载就很容易。
<?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); ... } }