Laravel实现dingo+JWT api接口之实战篇
来源:互联网 发布:人工智能电影观后感 编辑:程序博客网 时间:2024/06/05 05:23
上一篇文章讲解了如何配置安装包(点击这里),接下来讲解如何使用
这里我的需求比较特殊,使用的model并不是App/User,所以需要进行指定---》参考文章点击这里
①新建数据库及其model
1. 新建migrate:
php artisan make:migration create_clients_table --create=clients2. 新建model:php artisan make:model Client然后修改model Client的继承类如下:
use Illuminate\Foundation\Auth\User as Authenticatable;use Illuminate\Database\Eloquent\Model;/** * @property mixed user_pwd */class Client extends Authenticatable{。。。。。。。。。。3. 修改data/migrations/201x_xx_xx_xxxxxx_create_clients_table.php文件中的up方法如下:
public function up() { Schema::create('clients', function (Blueprint $table) { $table->increments('id'); $table->string('user_email',50); $table->string('user_pwd',100); $table->string('user_name',50); $table->timestamps(); }); }然后执行 php artisan migrate, 这样新的测试数据表就建好了。然后我们需要修改config/jwt.php中"user"=>"App\User"如下:'user' => 'App\Client',
②routes.php下添加dingo代码:
$api = app('Dingo\Api\Routing\Router');$api->version('v1', function ($api) { $api->group(['namespace' => 'App\Api\Controllers','middleware' => ['client.change']], function ($api) { $api->post('user/login', 'AuthController@authenticate'); //登录授权 $api->post('user/register', 'AuthController@register'); $api->group(['middleware' => 'jwt.auth'], function ($api) { //路径为 /api/tests $api->get('tests', 'TestsController@index'); //请求方式: //http://localhost:8000/api/tests?token=xxxxxx (从登陆或注册那里获取,目前只能用get) $api->get('tests/{id}', 'TestsController@show'); $api->get('user/me', 'AuthController@AuthenticatedUser'); //根据 }); });});以上我们进行一个个添加对应的模块。注:以上重点为(用于指定特定的model):
'middleware' => ['client.change']该middleware的代码如下:public function handle($request, Closure $next){ config(['jwt.user' => '\App\Client']); //重要用于指定特定model config(['auth.providers.users.model' => \App\Client::class]);//重要用于指定特定model!!!! return $next($request);}
③基础模块添加
首先在app目录下创建Api/Controllers及Api/Transformers目录,图如下:
然后在Controllers下创建BaseController.php 用于作为被继承的验证基础模块,代码如下:
<?phpnamespace App\Api\Controllers;use App\Http\Controllers\Controller;use Dingo\Api\Routing\Helpers;class BaseController extends Controller{ use Helpers; /**** * BaseController constructor. */ public function __construct() { }}
④认证模块添加
认证模块分为登录、注册、获取用户信息 ,全部代码如下:
<?phpnamespace App\Api\Controllers;use App\Client;use Illuminate\Http\Request;use JWTAuth;use Tymon\JWTAuth\Exceptions\JWTException;use Tymon\JWTAuth\Exceptions\TokenExpiredException;use Tymon\JWTAuth\Exceptions\TokenInvalidException;class AuthController extends BaseController{ /** * The authentication guard that should be used. * * @var string */ public function __construct() { parent::__construct(); } /** * @param Request $request * @return \Illuminate\Http\JsonResponse */ public function authenticate(Request $request) { $payload = [ 'user_email' => $request->get('email'), 'password' => $request->get('password') ]; try { if (!$token = JWTAuth::attempt($payload)) { return response()->json(['error' => 'token_not_provided'], 401); } } catch (JWTException $e) { return response()->json(['error' => '不能创建token'], 500); } return response()->json(compact('token')); } /** * @param Request $request */ public function register(Request $request) { $newUser = [ 'user_email' => $request->get('email'), 'user_name' => $request->get('name'), 'password' => bcrypt($request->get('password')) ]; $user = Client::create($newUser); $token = JWTAuth::fromUser($user); return $token; } /**** * 获取用户的信息 * @return \Illuminate\Http\JsonResponse */ public function AuthenticatedUser() { try { if (!$user = JWTAuth::parseToken()->authenticate()) { return response()->json(['user_not_found'], 404); } } catch (TokenExpiredException $e) { return response()->json(['token_expired'], $e->getStatusCode()); } catch (TokenInvalidException $e) { return response()->json(['token_invalid'], $e->getStatusCode()); } catch (JWTException $e) { return response()->json(['token_absent'], $e->getStatusCode()); } // the token is valid and we have found the user via the sub claim return response()->json(compact('user')); }}过程分析:
①继承自BaseController.php,继承了dingo的操作方法②继承BaseController.php的构造函数,并用config改变其指定model
③到这里如果没有配置错误的话就是就是三个模块都可以正常运行了
⑤认证模块使用讲解
这里我们首先使用postman(不清楚搜下。一个谷歌插件)请求localhost:8000/api/user/register 注册接口:
然后请求 localhost:8000/api/user/login 请求如下图:
同样我们得到了一个新的token,这里说明每次登陆都会刷新token这样我们复制最新token,下面有用
接下来我们使用刚获取的最新个人信息
⑥token获取信息模块
⑤中最后一个获取个人信息模块也属于这里。。。下面主要讲解返回特定的数据格式
首先在Transformers目录下添加TestsTransformer.php文件代码如下:
<?phpnamespace App\Api\Transformers;/**该类为dingo api封装好**/use League\Fractal\TransformerAbstract;class TestsTransformer extends TransformerAbstract{ /*** * 分开为了解耦 * 数据字段选择 * @param $lesson * @return array */ public function transform($lesson) { /******隐藏数据库字段*****/ return [ 'username' => $lesson['user_name'], 'email' => $lesson['user_email'], ]; }}注:这里继承了dingo的TransformerAbstract类
然后在Controllers目录下新建TestsController.php作为基础信息获取,代码如下:
<?phpnamespace App\Api\Controllers;use App\Api\Transformers\TestsTransformer;use App\Client;class TestsController extends BaseController{ public function index() { $tests = Client::all(); return $this->collection($tests, new TestsTransformer()); } public function show($id) { $test = Client::find($id); if (!$test) { return $this->response->errorNotFound('Test not found'); } return $this->item($test, new TestsTransformer()); }}
注:这里引用了TestsTransformer作为数据格式,item为dingo自带函数,处理数据格式并返回请求方式与⑤中请求localhost:8000/api/user/me?token=xxxxxxxxxxxxxxxxxxxx 一致,详情请求地址请看routes文件。
到此就讲完了Dingo+JWT接口开发了。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
- Laravel实现dingo+JWT api接口之实战篇
- Laravel实现dingo+JWT api接口之配置篇
- Laravel实现dingo+JWT api接口之配置篇
- Dingo + Laravel + JWT + Entrust + memcache 实现API设计
- laravel 5.4 JWT + Dingo 构建API 攻略
- Laravel 5 开发API(Dingo Api + JWT)
- lumen5.4整合dingo/api、jwt-auth
- Laravel-dingo/api获取路由
- Lumen上使用Dingo/Api做API开发时用JWT-Auth做认证的实现
- Lumen上使用Dingo/Api做API开发时用JWT-Auth做认证的实现
- Lumen上使用Dingo/Api做API开发时用JWT-Auth做认证的实现
- API接口JWT方式的Token认证(上),服务器(Laravel)的实现
- laravel dingo/api 安装与配置
- laravel dingo API返回自定义错误信息
- Laravel & Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
- Laravel & Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
- Laravel & Lumen RESTFul API 扩展包:Dingo API(一) —— 安装配置篇
- Spring Boot实战之Filter实现使用JWT进行接口认证
- 技术博客汇总
- hdu4006 The kth great number(优先队列)
- Prism应用开发(六)——MVVM高级话题
- 【win32】day12-Windows卷(Volumn)/目录/文件/文件的查找
- ofbiz之entity 实体解析 扩展 视图 复合列写法
- Laravel实现dingo+JWT api接口之实战篇
- android.view.WindowLeaked: Activity cn.com.zte.uc.activites.shipTicket.OrderWrite1 has leaked window
- C++学习006-条件运算符
- OFBiz 的Party PartyGroup主要关系
- ionic开发中的一些小技巧
- Prism应用开发(七)——导航
- iOS vDSP中的单矢量生成
- SQLServer 安全加固:ICP备案需要禁用的扩展存储过程
- 【HDU】-5748-Bellovin(LIS,变化)