laravel + dinggo + jwt搭建接口认证 用户认证
# 框架版本
- laravel ^8.40
- dingo/api ^3.0
- tymon/jwt-auth ^1.0.0-rc.1
# 安装dinggo
composer require dingo/api
1
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
1
# 创建Api
$api = app('Dingo\Api\Routing\Router');
$api->version('v1', function ($api) {
$api->post('/login', [AccountController::class, 'login']); // 登录
// 需要验证的
$api->group(['middleware' => 'api:auth'], function ($api) {
});
});
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 安装jwt
# 安装
应为默认的版本为0.1*
不支持高版本,所以修改composer.json
文件,在require
中添加
"tymon/jwt-auth": "^1.0.0-rc.1"
1
然后安装
composer update
1
在publish
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
1
# 生成秘钥
php artisan jwt:secret
1
# 修改认证模型
修改Member
模型用来认证(模型路径:app\Models\Member.php)
<?php
namespace App\Models;
use Dcat\Admin\Traits\HasDateTimeFormatter;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Foundation\Auth\User;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
class Member extends User implements JWTSubject
{
use Notifiable;
use HasDateTimeFormatter;
use SoftDeletes;
protected $table = 'member';
/**
* 获取将存储在JWT的主题声明中的标识符
*/
public function getJWTIdentifier()
{
return $this->getKey(); // 可以自定义,这里用的主键
}
/**
* 返回一个键值数组,其中包含要添加到JWT的任何自定义声明
*/
public function getJWTCustomClaims()
{
return [];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 配置Auth
修改 config/auth.php
修改默认的 guards
为
'guard' => 'api',
1
在 guards
中添加
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
1
2
3
4
2
3
4
在 provides
中,修改 users
为
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\Member::class, //自己定义的模型
],
]
1
2
3
4
5
6
2
3
4
5
6
# 创建Token
在控制器中验证生成
try {
// 验证用户是否存在,存在则颁发token,不存在,则不颁发token,这里会直接查询所给条件的账户,password默认是Hash的
if (!$token = JWTAuth::attempt(['username' => $username, 'password' => $password])) {
return response()->json(['error' => 'invalid_credentials'], 401);
}
} catch (JWTException $e) {
// 尝试对令牌进行编码时出错
return response()->json(['error' => 'could_not_create_token'], 500);
}
return compact('token');
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 连接dingo和jwt
首先,在 app\Providers\AppServiceProvider.php
中的 boot
方法里面添加 dingo
添加 jwt
扩展
public function boot(){
//驱动
app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) {
return new \Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']);
});
}
1
2
3
4
5
6
2
3
4
5
6
然后在 config\api.php
找到'auth'=>[]
,修改如下:
'auth' => [
'jwt' => 'Dingo\Api\Auth\Provider\JWT',
],
1
2
3
2
3
config\app.php
中providers
添加:
Dingo\Api\Provider\LaravelServiceProvider::class,
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
1
2
2
然后 config\jwt.php
这个文件在上面执行命令的时候会自动从 vendor\tymon\jwt-auth\config\config.php
复制过去,如果没有这个文件请手动执行
文件里面注意这三个地方(这是正确的写法):
'jwt' => Tymon\JWTAuth\Providers\JWT\Lcobucci::class,
'auth' => Tymon\JWTAuth\Providers\Auth\Illuminate::class,
'storage' => Tymon\JWTAuth\Providers\Storage\Illuminate::class,
1
2
3
2
3
最后在.env
中添加
API_PREFIX=api
API_STANDARDS_TREE=vnd
API_VERSION=v1
API_DEBUG=false
1
2
3
4
2
3
4
用户登录成功之后,下一步就是发送一个包含 token
的请求来获取用户信息。
要通过http发送一个需要认证通过的请求,需要设置 Authorization
头:
Authorization: Bearer+空格+token
1
上次更新: 2023/12/22, 10:33:26