分析laravel8中的dingo与jwt鉴权
下面由laravel教程栏目给大家介绍laravel8中dingo与jwt鉴权,希望对需要的朋友有所帮助!
1 什么是dingo
dingo api包是给laravel和lumen提供的Restful的工具包,它可以与jwt组件一起配合快速的完成用户认证,同时对于数据和运行过程中所产生的异常能够捕获到并且可以做出对应的响应。
主要功能:
- Router Version 路由版本管理
- http Exception 异常处理
- response transform 转化响应格式
1 安装dingo
在laravel根目录下通过composer进行dingo扩展包的安装,具体命令如下:
composer require dingo/api
使用以下命令可以发布 API 的配置文件到 config 文件下:
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
2 配置dingo
关于dingo的api配置信,我们可以在.env文件中进行配置
# dingo # API_SUBTYPE —— 项目的简称; API_SUBTYPE=lms # API_PREFIX —— 与 API_DOMAIN 二选一,路由的前缀,例如设置为 api API_PREFIX=api # 定义版本 API_VERSION=v1 # 是否开启调试模式 API_DEBUG=true
关于dingo的详细配置请查看相关文档:https://learnku.com/docs/dingo-api/2.0.0/Configuration/1444
2 什么是JWT
jwt全称JSON Web Tokens ,是一个非常轻巧的规范,这个规范允许我们使用jwt在用户和服务器之间传递安全可靠的信息,他的主要使用场景为:认证与数据交换
1 安装JWT
在laravel根目录下通过composer进行jwt扩展包的安装,具体命令如下:
composer require tymon/jwt-auth
使用以下命令可以发布 API 的配置文件到 config 文件下:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
2 配置JWT
在.env文件中生成jwt加密秘钥,具体命令如下:
php artisan jwt:secret
修改config/api.php配置
'auth' => [ 'jwt' => 'Dingo\Api\Auth\Provider\JWT', ],
修改config/auth.php配置
'defaults' => [ #注:这里修改改了默认的配置,默认是web 'guard' => 'api', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'jwt', 'provider' => 'users', 'hash' => false, ], ],
关于jwt的详细配置请查看相关文档:https://jwt-auth.readthedocs.io/en/develop/
3 相关代码演示
创建RefreshToken中间件,用于令牌过期刷新
namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; use Illuminate\Http\Request; use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException; use Tymon\JWTAuth\Exceptions\JWTException; use Tymon\JWTAuth\Exceptions\TokenExpiredException; use Tymon\JWTAuth\Http\Middleware\BaseMiddleware; class RefreshToken extends BaseMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle(Request $request, Closure $next) { // 检查此次请求中是否带有 token,如果没有则抛出异常。 $this->checkForToken($request); // 使用 try 包裹,以捕捉 token 过期所抛出的 TokenExpiredException 异常 try { // 检测用户的登录状态,如果正常则通过 if ($this->auth->parseToken()->authenticate()) { return $next($request); } throw new UnauthorizedHttpException('jwt-auth', '未登录'); } catch (TokenExpiredException $exception) { // 此处捕获到了 token 过期所抛出的 TokenExpiredException 异常,我们在这里需要做的是刷新该用户的 token 并将它添加到响应头中 try { // 刷新用户的 token $token = $this->auth->refresh(); // 使用一次性登录以保证此次请求的成功 Auth::guard('api') ->onceUsingId($this->auth->manager() ->getPayloadFactory() ->buildClaimsCollection() ->toPlainArray()['sub']); } catch (JWTException $exception) { // 如果捕获到此异常,即代表 refresh 也过期了,用户无法刷新令牌,需要重新登录。 throw new UnauthorizedHttpException('jwt-auth', $exception->getMessage()); } } // 在响应头中返回新的 token return $this->setAuthenticationHeader($next($request), $token); } }
User模型需要实现两个方法:getJWTIdentifier()和getJWTCustomClaims()
<?php namespace App\Models; use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Tymon\JWTAuth\Contracts\JWTSubject; class User extends Authenticatable implements JWTSubject { use Notifiable; public $table = "user"; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password','phone','status','create_time','addr_id' ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /** * The attributes that should be cast to native types. * * @var array */ protected $casts = [ // 'email_verified_at' => 'datetime', ]; /** * 指示是否自动维护时间戳 * * @var bool */ public $timestamps = false; public function getJWTIdentifier() { return $this->getKey(); } public function getJWTCustomClaims() { return []; } } ?>
创建UserController用于鉴权等相关操作
<?php namespace App\Http\Controllers\Api\V1; use App\Http\Controllers\Controller; use App\Models\User; use Dingo\Api\Routing\Helpers; use Illuminate\Http\Request; class UserController extends Controller { use Helpers; public function __construct() { //除去token验证的方法 $this->middleware('refresh.token', [ 'except' => [ 'login', ], ]); } /**用户登录 * @param Request $request * @return \Illuminate\Http\JsonResponse|void */ public function login(Request $request) { $phone = $request->get('phone'); $user = User::where('phone', $phone)->first(); // //attempt貌似无法验证其他字段,如需用其他字段鉴权使用login() // $credentials = request(['name','password']); // if (!$token = auth()->attempt($credentials)) { // return response()->json(['error' => 'Unauthorized'], 401); // } //只要是user实例就可以通过login鉴权 if (! $token = auth()->login($user)) { return response()->json([ "restful" => false, "message" => "账号错误", ]); } //获取用户信息 $user = $this->user(); $key = "user::info::".$user->id; //Redis缓存用户信息3600秒 Redis::set($key,serialize($user->original),"EX",3600); return $this->respondWithToken($token); } /**获取用户 * Get the authenticated User. * * @return \Illuminate\Http\JsonResponse */ public function user() { return response()->json(auth()->user()); } /**用户退出 * Log the user out (Invalidate the token). * * @return \Illuminate\Http\JsonResponse */ public function logout() { auth()->logout(); return response()->json(["message" => "退出成功"]); } /**用户登录状态刷新 * Refresh a token. * @return \Illuminate\Http\JsonResponse */ public function refresh() { return $this->respondWithToken(auth()->refresh()); } /**返回值 * @param $token * @return array */ protected function respondWithToken($token) { return [ 'access_token' => $token, 'token_type' => 'Bearer', 'expires_in' => auth()->factory()->getTTL() * 60, 'restful' => true ]; } }
以上是分析laravel8中的dingo与jwt鉴权的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

Django和Laravel都是全栈框架,Django适合Python开发者和复杂业务逻辑,Laravel适合PHP开发者和优雅语法。1.Django基于Python,遵循“电池齐全”哲学,适合快速开发和高并发。2.Laravel基于PHP,强调开发者体验,适合小型到中型项目。

Laravel是如何在后端逻辑中发挥作用的?它通过路由系统、EloquentORM、认证与授权、事件与监听器以及性能优化来简化和增强后端开发。1.路由系统允许定义URL结构和请求处理逻辑。2.EloquentORM简化数据库交互。3.认证与授权系统便于用户管理。4.事件与监听器实现松耦合代码结构。5.性能优化通过缓存和队列提高应用效率。

PHP和Laravel不是直接可比的,因为Laravel是基于PHP的框架。1.PHP适合小型项目或快速原型开发,因其简单直接。2.Laravel适合大型项目或高效开发,因其提供丰富功能和工具,但学习曲线较陡,性能可能不如纯PHP。

laravelisabackendframeworkbuiltonphp,设计ForweBapplicationDevelopment.itfocusessonserver-sideLogic,databasemagemention和Applicationstructure和CanBeintegratedWithFrontendTechnologiesLikeLikeVue.jsorreActeReacterVue.jsorreActforforfull-stackDevefloct。

Laravel受欢迎的原因包括其简化开发过程、提供愉快的开发环境和丰富的功能。1)它吸收了RubyonRails的设计理念,结合PHP的灵活性。2)提供了如EloquentORM、Blade模板引擎等工具,提高开发效率。3)其MVC架构和依赖注入机制使代码更加模块化和可测试。4)提供了强大的调试工具和性能优化方法,如缓存系统和最佳实践。

Laravel和Python在开发环境和生态系统上的对比如下:1.Laravel的开发环境简单,仅需PHP和Composer,提供了丰富的扩展包如LaravelForge,但扩展包维护可能不及时。2.Python的开发环境也简单,仅需Python和pip,生态系统庞大,涵盖多个领域,但版本和依赖管理可能复杂。

选择Laravel开发项目是因为其灵活性和强大功能适应不同规模和复杂度的需求。Laravel提供路由系统、EloquentORM、Artisan命令行等功能,支持从简单博客到复杂企业级系统的开发。

Laravel在后端开发中的核心功能包括路由系统、EloquentORM、迁移功能、缓存系统和队列系统。1.路由系统简化了URL映射,提高了代码组织和维护性。2.EloquentORM提供了面向对象的数据操作,提升了开发效率。3.迁移功能通过版本控制管理数据库结构,确保一致性。4.缓存系统减少数据库查询,提升响应速度。5.队列系统有效处理大规模数据,避免阻塞用户请求,提升整体性能。
