本文目录
前言
在当今的Web开发中,API的安全认证与授权是构建可靠服务不可或缺的一环。本指南将带您深入探索如何使用tymon/jwt-auth这一流行的JWT(JSON Web Tokens)认证包,为Laravel API项目增添一层安全屏障。从安装tymon/jwt-auth开始,我们将一步步指导您如何配置JWT认证,包括发布配置文件、生成JWT密钥、更新用户模型以及配置认证守卫。此外,我们还将通过dingo/api的配置,展示如何优雅地处理API请求。接着,通过失败与成功的认证例子,您将学会如何设计安全的认证路由及其方法。最后,我们还将探讨如何根据JWT token获取用户信息,为后续的API请求提供身份验证依据。无论您是Laravel API开发的新手,还是希望提升API安全性的资深开发者,本指南都将为您提供宝贵的参考和实战指导。
1、tymon/jwt-auth api认证
1.1 安装tymon/jwt-auth
1、安装tymon/jwt-auth
composer require tymon/jwt-auth
1-1 安装报错可看,不报错可越过。
如果安装过程中报错,建议先使用php7.x
因为现在高版本还不适配,如果你的homestead
的php
版本高的话可以降低版本:
使用命令:
sudo update-alternatives --config php
执行后,会列出当前 php 所有版本和编号,输入编号,切换到执行的版本。
当前切换后切记homestead
的环境php也要对应php
版本,修改Homestead.yaml
:
修改完后记得sudo vagrant reload --provision
重启下虚拟机。
2、发布配置文件,生成 JWT_SECRET
1、发布配置文件
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
2、生成 JWT_SECRET
php artisan jwt:secret
3、更新User模型
认证一般基于用户,所以我们修改用户模型:
还要增加两个方法:
/**
* 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 [];
}
Tips:如果你是自己创建的模型做认证的话那么你的模型要继承原始User模型,如下:
4、配置 Auth guard
Tips:如果是做前后台都要jwt认证的话,那么这块就写成:
那么在providers
中修改:
具体你要那个模型做驱动。
那么在路由认证这块就要修改为具体是哪个认证守卫了:
2、dingo/api配置
在 config/api.php
文件:
'auth' => [
'jwt' => 'Dingo\Api\Auth\Provider\JWT',
],
3、认证例子
3.1 失败例子
1、认证路由
在routes/api
下增加需要登录的路由:
// 需要登陆的路由
$api->group(['middleware' => 'api.auth'], function($api) {
$api->get('users', [\App\Http\Controllers\TestController::class, 'users']);
});
2、认证路由方法
public function users() {
$users = User::all();
return $this->response->collection($users, new UserTransformer);
}
在Providers/AppServiceProvider
中boot
方法里写入:
app('Dingo\Api\Exception\Handler')->register(function (AuthenticationException $exception) {
return response()->json([
'msg' => 'Unauthenticated',
'status_code' => 401
]);
});
效果:
可以看到需要认证了。
3.2 成功例子
1、登陆路由
// 执行登陆
$api->post('login', [\App\Http\Controllers\TestController::class, 'login']);
2、登陆路由方法
我们先用dd(bcrypt('12345')
获取到加密的密文:
找到数据库中数据,密码替换:
然后登陆路由方法
public function login(Request $request) {
// dd(bcrypt('12345'));
$credentials = request(['email', 'password']);
if (!$token = auth('api')->attempt($credentials)) {
return $this->response->errorUnauthorized();
}
return $this->respondWithToken($token);
}
/**
* Get the token array structure.
*
* @param string $token
*
* @return \Illuminate\Http\JsonResponse
*/
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'Bearer',
'expires_in' => auth('api')->factory()->getTTL() * 60
]);
}
在postman
中测试:
可以看到给我们成功返回token
了,复制token
,请求users
带入:
可以看到也成功的请求回来需要认证的接口了。
4、根据token获取用户信息
public function users() {
// $users = User::all();
// return $this->response->collection($users, new UserTransformer);
// 从token获取用户信息
$user = app('Dingo\Api\Auth\Auth')->user();
return $user;
}
还可以使用:
$user = auth('api')->user();
return $user;
在学习的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持