什么是jwt?
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,用于在各方之间作为JSON对象安全地传输信息。此信息可以通过数字签名进行验证和信任。JWT可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对进行签名。
jwt简介链接 JWT.IO - JSON Web Tokens Introduction
我们在做api请求的时候,通常要使用token,来验证是否这个请求能不能访问。
一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
本文中所使用的版本
Laravel 5.5
jwt-auth 1.0.0-rc.1(在安装中也参考了很多文章 其他版本一直配置的不太顺利,这个版本比较好点)
开始安装jwt
(本次安装不建议直接在项目中安装及使用)
1.composer 安装jwt
composer require tymon/jwt-auth 1.0.0-rc.1
2.在config 文件夹的app.php 中注册服务提供者,经测试,不需要这步
'providers'
3.生成配置文件
php artisan vendor:publish --provider="TymonJWTAuthProvidersLaravelServiceProvider"
4.生成jwt 密钥
php artisan jwt:secret
然后会在我们的 .env 文件中生成jwt密钥

5.在auth.php 文件中 配置 auth guard 让api的driver使用jwt
-
'guards' => [ -
'web' => [ -
'driver' => 'session', -
'provider' => 'users', -
], -
'api' => [ -
'driver' => 'jwt',//更改此处为jwt -
'provider' => 'users', -
], -
],
6.更改 User model使其支持 jwt-auth
-
<?php -
namespace App; -
use TymonJWTAuthContractsJWTSubject; -
use IlluminateNotificationsNotifiable; -
use IlluminateFoundationAuthUser as Authenticatable; -
class User extends Authenticatable implements JWTSubject -
{ -
use Notifiable; -
protected $table = 'users'; -
/** -
* Get the identifier that will be stored in the subject claim of the JWT. -
* -
* @return mixed -
*/ -
public function getJWTIdentifier() -
{ -
return $this->getKey(); -
} -
/** -
* Return a key value array, containing any custom claims to be added to the JWT. -
* -
* @return array -
*/ -
public function getJWTCustomClaims() -
{ -
return []; -
}
7.配置 中间件
在 Middleware 文件夹下新建 ApiAuth.php 中间件文件
-
<?php -
namespace AppHttpMiddleware; -
use Closure; -
use TymonJWTAuthFacadesJWTAuth; -
use TymonJWTAuthExceptionsJWTException; -
use TymonJWTAuthExceptionsTokenExpiredException; -
use TymonJWTAuthExceptionsTokenInvalidException; -
class ApiAuth -
{ -
/** -
* Handle an incoming request. -
* -
* @param IlluminateHttpRequest $request -
* @param Closure $next -
* @return mixed -
*/ -
public function handle($request, Closure $next) -
{ -
try { -
if (! $user = JWTAuth::parseToken()->authenticate()) { //获取到用户数据,并赋值给$user -
return response()->json([ -
'errcode' => 1004, -
'errmsg' => '无此用户' -
], 404); -
} -
return $next($request); -
} catch (TokenExpiredException $e) { -
return response()->json([ -
'errcode' => 1003, -
'errmsg' => 'token 过期' , //token已过期 -
]); -
} catch (TokenInvalidException $e) { -
return response()->json([ -
'errcode' => 1002, -
'errmsg' => 'token 无效', //token无效 -
]); -
} catch (JWTException $e) { -
return response()->json([ -
'errcode' => 1001, -
'errmsg' => '缺少token' , //token为空 -
]); -
} -
} -
}
注册中间件 在 Kernel.php 中注册中间件 并设置别名
-
protected $routeMiddleware = [ -
'api.auth' => AppHttpMiddlewareApiAuth::class, -
];
到此你的jwt就算安装配置完成了
**基本使用**
1.新建AuthCtorller.php 控制器
php artisan make:controller AuthController
2.编辑 测试控制器
-
<?php -
namespace AppHttpControllers; -
use AppUser; -
use IlluminateHttpRequest; -
use TymonJWTAuthFacadesJWTAuth; -
use IlluminateSupportFacadesHash; -
class AuthController extends Controller -
{ -
/** -
* jwt 测试 -
*/ -
//登录 -
public function login(Request $request){ -
$username = $request->get('username'); -
$password = $request->get('password'); -
$user_mes = User::where('username','=',$username)->first(); -
if (!$user_mes || !Hash::check($password, $user_mes->password)) { -
return "账号或密码错误"; -
} -
$token=JWTAuth::fromUser($user_mes);//生成token -
if (!$token) { -
return "登录失败,请重试"; -
} -
return response()->json(['token'=>$token]); -
} -
//获取用户信息 -
public function home(){ -
$user=JWTAuth::parseToken()->touser();//获取用户信息 -
return $user; -
} -
//退出 -
public function logout(){ -
JWTAuth::parseToken()->invalidate();//退出 -
return '退出成功'; -
} -
}
3.编辑路由
-
<?php -
Route::post('/login','AuthController@login');//登录 -
Route::group(['middleware' => 'api.auth'], function () { -
Route::post('/home','AuthController@home');//获取用户信息 -
Route::post('/logout','AuthController@logout');//退出 -
});
4.开始测试
测试登录 /api/login 这里就成功的拿到了token

获取用户信息 /api/home

退出 /api/logout

再次访问 /api/home 就会发现token 无效

**其他** - 设置token 永不过期
在jwt.php 中 找到此处把过期时间设置为null

在这个地方删除exp 即可设置token 永不过期

本文来自
杨攀遥博客_个人技术博客_分享我的编程之路www.yangpanyao.com
如若转载,无需和我联系,但请注明出处:
Laravel 安装 jwt 及基本使用www.yangpanyao.com
本文详细介绍了如何在Laravel 5.5中安装和配置JWT Auth,包括composer安装、服务提供者注册、密钥生成、authguard设置、Usermodel修改和API中间件的实现。通过登录、信息获取与退出示例,展示了JWT在API安全中的应用。
1385

被折叠的 条评论
为什么被折叠?



