laravel 接口使用JWT(dingo)认证

主要总结下个人使用过程
1.下载插件

composer require tymon/jwt-auth:1.0.*@dev

有的版本(5.8.35)在下载tymon/jwt-auth会同时下载dingo/api和更新其他插件,如果没有下载dingo/api,请执行下面命令  

composer require dingo/api    

有些版本(5.8.38)可能直接无法下载,
可在composer.json文件的require添加
"dingo/api": "^2.3"
然后执行命令 composer update(会同时更新其他插件)

2.生成新的配置文件

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
// 这条命令会在 config 下增加一个 jwt.php 的配置文件

php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
//这条命令会在 config 下增加一个 api.php 的配置文件

3.生成jwt秘钥

php artisan jwt:secret //会在.env里添加一行JWT_SECRET=秘钥 秘钥也可自定义

4.配置相关内容,这里建议原来的配置是注释而不是删除
1).修改config/auth.php文件里的信息

a.修改defaults的guards为
    'defaults'  =>  [
    //        'guard' => 'web',//原来的配置信息
    //        'passwords' => 'users',//原来的配置信息
    'guard'  =>  'api', 
    'passwords'  =>  'supplier',
    ],

b.在guards中修改或添加
    'guards'  =>  [
        'api'  =>  [
            'driver'  =>  'jwt',
            'provider'  =>  'api',
        ]
    ]

c.在providers 中修改或添加
    'providers'  =>  
        'api'  =>  [
            'driver'  =>  'eloquent',
            'model'  => App\Account::class,//可自定义,记得配置同步即可
            ],
        ]

2).

2).修改 app/Providers/AppServiceProvider.php文件,在boot方法添加

    public function boot()
    {
        //驱动 将dingoh和jwt联系起来
        app('Dingo\Api\Auth\Auth')->extend('jwt', function ($app) {
            return new \Dingo\Api\Auth\Provider\JWT($app['Tymon\JWTAuth\JWTAuth']);
        });
    }

3).修改config/api.php文件, 找到’auth’=>[]添加或修改,

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

4).修改config/app.php文件,

a.在providers添加
    Dingo\Api\Provider\LaravelServiceProvider::class,
    Tymon\JWTAuth\Providers\LaravelServiceProvider::class,

b.在aliases添加
    'JWTAuth'  =>  'Tymon\JWTAuth\Facades\JWTAuth',
    'JWTFactory'  =>  'Tymon\JWTAuth\Facades\JWTFactory',

5).修改文件 .env, 在最下面(个人习惯)添加

    API_PREFIX=api
    API_STANDARDS_TREE=vnd
    API_VERSION=v1
    API_DEBUG=false

5.添加BaseController文件,内容如下

<?php
namespace App\Http\Controllers\API;
use Dingo\Api\Routing\Helpers;
use App\Http\Controllers\Controller;

class BaseController extends Controller
{
    //
    use Helpers;

    /****
     * BaseController constructor.
     */
    public function __construct()
    {

    }
}
//注意命名空间的大小写

6.添加登录接口的模型文件,信息同步 步骤 4->1)->c,也可不添加,使用已有的模型文件.把里面的表名和字段名,改成自己的登录表及字段名,内容参考如下.

<?php
namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authuser;

class Account extends Authuser implements JWTSubject
{
    use Notifiable;

    //定义表
    protected $table = "users";//修改为自己的登录表

    protected $hidden = ['remember_token'];
    // Rest omitted for brevity

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey(); /*自己可以定义的生成token的参数,这个用的是将主键加密*/
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
    protected $fillable = ['name','mobile','password'];
    //定义主键
    protected $primaryKey = "id";

}

7.添加接口文件 ApiController.php,内容参考如下

<?php
namespace App\Http\Controllers\API;
use Encore\Admin\Facades\Admin;
use Illuminate\Support\Facades\DB;
use Tymon\JWTAuth\JWTAuth;
use Illuminate\Http\Request;
class ApiController extends BaseController
{
    protected $jwt;
    public function __construct(JWTAuth $jwt)
    {
        $this->jwt = $jwt;
    }

    public function login_jwt(Request $request)
    {
        $this->validate($request, [
            'username'    => 'required|max:255',
            'password' => 'required',
        ]);
        try {
            //验证用户是否存在,
    if(empty(admin_users::where('username',$request['username'])->first())){
               return self::return_('手机号未注册',404);
            }
            //用户与密码是否正确
            if (! $token = $this->jwt->attempt($request->only('username', 'password'))) {
                return self::return_('用户名或密码错误',500);
            }
        } catch (\Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {

            return self::return_('登录过期',500);
        } catch (\Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {

            return self::return_('无效的token',500);
        } catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {

            return self::return_('token未提交',500,$e->getMessage());
        }catch (\Exception $e){
            return self::return_('操作出错',500,$e->getMessage());
        }
        $user=auth('api')->user();
        return self::return_('OK',200,$user);
    }
    // 返回数据
     private static function return_($errmsg='',$errcode=200,$data=[]){
         if(empty($data)){
             return ['errcode'=>$errcode,'errmsg'=>$errmsg];
         }else{
             return ['errcode'=>$errcode,'errmsg'=>$errmsg,'data'=>$data];
         }
     }
//测试接口
    public function test(){
        return 'test';
    }

}

8.修改路由api文件routes/api.php ,内容可参考如下

<?php

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/
//这里的的接口,都是不需要认证的
Route::get('source', 'API\ApiController@source');//来源范围

$api = app("Dingo\Api\Routing\Router");
$api->version('v1', function ($api) {
    $api->group(["namespace" => "App\Http\Controllers\API",'middleware'=>'jwt.auth'], function ($api) {
        //需要认证的接口放在这里
        $api->get('test', 'ApiController@test');
    });

    $api->group(["namespace" => "App\Http\Controllers\API"], function ($api) {
        //不需要认证的接口放这里或者写在$api之外
        //使用dingo 插件后,这里 必须加一个接口,即使不存在的接口也行,否则所有接口都会报错
        $api->post('login', 'ApiController@login_jwt');
    });
});

参考文档:blog.csdn.net/m0_37632915/article/...
内容基本都是参考的这个文档,不同的地方,主要是自己在使用过程出现的问题.

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

Laravel Sanctum 不香吗? :smile:

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!