Mrcdh技术博客 Mrcdh技术博客
首页
  • Html5
  • Javascript
  • Nodejs
  • electron
  • Android
  • 微信公众号
  • 框架
  • 其他
  • Mysql
  • PHP
  • Python
  • java
  • Gulp
  • 其它
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Mrcdh

全栈开发小学生
首页
  • Html5
  • Javascript
  • Nodejs
  • electron
  • Android
  • 微信公众号
  • 框架
  • 其他
  • Mysql
  • PHP
  • Python
  • java
  • Gulp
  • 其它
  • 网站
  • 资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • ThinkPHP

  • FastAdmin

  • laravel

    • Laravel路由
    • Laravel ORM模型
    • Laravel请求
    • Laravel视图
    • Laravel Blade模板
    • Laravel Blade模板-组件
    • Laravel 响应
    • laravel常见问题
    • laravel数据迁移给表添加注释
    • laravel + dinggo + jwt搭建接口认证 用户认证
      • 框架版本
      • 安装dinggo
        • 创建Api
      • 安装jwt
        • 安装
        • 生成秘钥
        • 修改认证模型
        • 配置Auth
        • 创建Token
      • 连接dingo和jwt
    • laravel中使用scss和tailwindcss
  • laravel-jetstream.vue

  • laravel常用扩展包

  • 《PHP框架》
  • laravel
mrcdh
2021-06-21
目录

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

# 安装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

# 配置Auth

修改 config/auth.php

修改默认的 guards 为

'guard' => 'api',
1

在 guards 中添加

'api' => [
  'driver' => 'jwt',
  'provider' => 'users',
],
1
2
3
4

在 provides 中,修改 users 为

'providers' => [
  'users' => [
    'driver' => 'eloquent',
    'model' => App\Models\Member::class,  //自己定义的模型
  ],
]
1
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

# 连接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

然后在 config\api.php 找到'auth'=>[],修改如下:

'auth' => [
  'jwt' => 'Dingo\Api\Auth\Provider\JWT',
],
1
2
3

config\app.php中providers添加:

Dingo\Api\Provider\LaravelServiceProvider::class,
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
1
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

最后在.env 中添加

API_PREFIX=api
API_STANDARDS_TREE=vnd
API_VERSION=v1
API_DEBUG=false
1
2
3
4

用户登录成功之后,下一步就是发送一个包含 token 的请求来获取用户信息。 要通过http发送一个需要认证通过的请求,需要设置 Authorization 头:

Authorization: Bearer+空格+token
1
#php#laravel
上次更新: 2023/12/22, 10:33:26
laravel数据迁移给表添加注释
laravel中使用scss和tailwindcss

← laravel数据迁移给表添加注释 laravel中使用scss和tailwindcss→

最近更新
01
uniapp常见问题
03-19
02
Vue3项目搭建
12-25
03
使用pnpm的monorepo组织项目
11-01
更多文章>
Theme by Vdoing | Copyright © 2020-2025 Mrcdh | 苏ICP备2020058908号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×