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 协议》,转载必须注明作者和本文链接
Laravel Sanctum 不香吗? :smile: