Laravel配合jwt使用的方法实例
网络编程 2021-07-04 23:06www.168986.cn编程入门
这篇文章主要给大家介绍了关于Laravel配合jwt使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们狼蚁网站SEO优化随着长沙网络推广来一起学习学习吧
测试使用的是Laravel5.5版本。
安装
poser require tymon/jwt-auth=1.0.0-rc.5
配置
生成配置
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider" php artisan jwt:secret
auth配置
<?php return [ ... 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], // 使用jwt 'api' => [ 'driver' => 'jwt', 'provider' => 'apiUser', ], ], 'providers' => [ ... // 指定model 'apiUser' => [ 'driver' => 'eloquent', 'model' => App\ApiUser::class, ], ], ];
编码
控制器
<?php namespace App\Http\Controllers\Api; use App\ApiUser; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Tymon\JWTAuth\Facades\JWTAuth; class AuthController extends Controller { / 中间件去除login和refresh @return void / public function __construct() { $this->middleware('auth:api', ['except' => ['login','refresh']]); } / Get a JWT via given credentials. @return \Illuminate\Http\JsonResponse / public function login(Request $request) { $credentials = $request->only('phone', 'password'); if (count($credentials) < 2) { return response()->json(['error' => 'Unauthorized'], 401); } $user = ApiUser::where('phone', $credentials['phone']) ->where('password', md5($credentials['password'])) ->first(); if (empty($user) || !$token = JWTAuth::fromUser($user)) { return response()->json(['error' => 'Unauthorized'], 401); } // dd($token); return $this->respondWithToken($token); } / Get the authenticated User. @return \Illuminate\Http\JsonResponse / public function me() { return response()->json(auth('api')->user()); } / Log the user out (Invalidate the token). @return \Illuminate\Http\JsonResponse / public function logout() { auth()->logout(); return response()->json(['message' => 'Suessfully logged out']); } / Refresh a token. @return \Illuminate\Http\JsonResponse / public function refresh() { return $this->respondWithToken(auth('api')->refresh()); } / Get the token array structure. @param string $token @return \Illuminate\Http\JsonResponse / protected function respondWithToken($token) { return response()->json([ 'aess_token' => $token, 'token_type' => 'bearer', 'expires_in' => auth('api')->factory()->getTTL() 60 ]); } }
路由
此处注意,我为了方便测试,使用了get方法,生产环境不建议使用get。
// routes/api.php Route::middleware('api')->prefix('auth')->namespace('Api')->group(function () { Route::get('login', 'AuthController@login'); Route::post('logout', 'AuthController@logout'); Route::get('refresh', 'AuthController@refresh'); Route::get('me', 'AuthController@me'); });
测试一下:
unauthenticated处理
这里需要注意下,unauthenticated处理一下比较好,否则会默认跳转login登录页面。
<?php namespace App\Exceptions; use Exception; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Illuminate\Auth\AuthenticationException; class Handler extends ExceptionHandler { ... protected function unauthenticated($request, AuthenticationException $exception) { return response()->json(['message' => 'Unauthenticated.'], 401); /非api可以这么处理 return $request->expectsJson() ? response()->json(['message' => 'Unauthenticated.'], 401) : redirect()->guest(route('login')); / } }
加入token refresh
加入中间件代码
<?php namespace App\Http\Middleware; use Closure; use Tymon\JWTAuth\Facades\JWTAuth; use Tymon\JWTAuth\Exceptions\JWTException; use Illuminate\Auth\AuthenticationException; use Tymon\JWTAuth\Exceptions\TokenExpiredException; use Illuminate\Http\Exceptions\HttpResponseException; use Tymon\JWTAuth\Http\Middleware\BaseMiddleware; class RefreshToken extends BaseMiddleware { / Handle an ining request. @param \Illuminate\Http\Request $request @param \Closure $next @return mixed / public function handle($request, Closure $next) { try{ //检查请求中是否带有token 如果没有token值则抛出异常 $this->checkForToken($request); if ($request->user = JWTAuth::parseToken()->authenticate()) { return $next($request); } throw new AuthenticationException('Unauthorized', []); }catch (TokenExpiredException $exception){ //返回特殊的code throw new HttpResponseException(response()->json([ 'message' => 'token expired' ])); } catch (\Exception $exception) { throw new AuthenticationException('Unauthorized', []); } } }
注册
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { ... protected $routeMiddleware = [ 'token.refresh' => \App\Http\Middleware\RefreshToken::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, ]; }
相应的控制器构造函数修改
public function __construct() { $this->middleware('token.refresh', ['except' => ['login','refresh']]); }
把token时间设置成1分钟,测试一下。
可以根据api返回,去调用刷新接口。
简单使用就是这样啦。
到此这篇关于Laravel配合jwt使用的文章就介绍到这了,更多相关Laravel配合jwt使用内容请搜索狼蚁SEO以前的文章或继续浏览狼蚁网站SEO优化的相关文章希望大家以后多多支持狼蚁SEO!
编程语言
- 宿迁百度关键词排名指南:实现精准营销的关键
- 四川SEO优化怎么做网络推广
- 立昂技术备案老域名收购:如何为您的业务赋能
- 安徽百度关键词seo贵不贵,一般需要多少钱
- 吉林百度快照排名怎么做电话营销
- 多伦新手做SEO怎么做
- 甘肃优化关键词排名推广怎么做论坛营销
- 沙雅SEO网站推广:提升您的在线可见性
- 四川SEO优化如何提升销售额和销售量
- 聂荣网站排名优化:提升网站可见性的全方位指
- 涞水SEO:提升地方企业在线可见性的策略
- 辽宁百度seo排名怎样做网站排名
- 临湘哪有关键词排名优化:提升网站可见度的关
- 黑龙江百度网站优化有没有优惠
- 凉城优化关键词排名推广:提升您的网络可见性
- 萝北整站优化:提升您网站流量和排名的全面指