laravel5.4 使用Dingo/Api v2.0+Passport实现api认证
2018-02-05 17:42
796 查看
我学习laravel5.4的时候看官方文档,有很多内容说的不够详细,很多朋友学习过程中会遇到不少坑,我这是其中之一,爬了两天坑,才爬出来。
首先我这里生成一个全新的laravel5.4项目。
接下来,将 Passport 的服务提供者注册到配置⽂件 config/app.php 的providers 数组中:
Passport 使⽤服务提供者注册内部的数据库迁移脚本⽬录,所以上⼀步完成后,你需要更新你的数据库结构。Passport 的迁移脚本会⾃动创建应⽤程序需要的客户端数据表和令牌数据表:
在.env 文件配置好数据库,这里不用多说了。laravel 5.4 改变了默认的数据库字符集,默认字符编码换成了
所以我们要修改app/Providers/AppServiceProvider.php :
然后运行artisan生成数据表:
然后运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条命令也会创建「私人访问」客户端和「密码授权」客户端:
然后Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中,这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用域:
接下来,需要在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 函数。这个函数会注册一些在访问令牌、客户端、私人访问令牌的发放和吊销过程中会用到的必要路由:
配置文件 config/auth.php 中 api 部分的授权保护项( driver )改为 passport 。
在这里,我们添加了,注册,登录 ,详情的路由
接着增加控制器,在APP/HTTP/Controller 目录新增一个专门的API文件夹放
G:\WWW\liangzengyun> php artisan make:controller Api/UserController
在UserController控制器中添加:
接下来,我们测试 一下接口:
都能正常使用,
或者你可以在命令行执行
打开
之前。
再次设置更改路由,
4000
打开 routes/api.php 文件添加
不多说,上图:
这里我们可以用刚才生成的Client ID与Client Secret来密码认证访问,也可以测试一下注册,登录 与详情页面,都能正常访问。(这几个页面的访问不变)。
到些大功告成,大家有问题可以提出交流一下,哈!!
首先我这里生成一个全新的laravel5.4项目。
安装passport:
使⽤ Composer 依赖包管理器安装 Passport :composer require laravel/passport
接下来,将 Passport 的服务提供者注册到配置⽂件 config/app.php 的providers 数组中:
Laravel\Passport\PassportServiceProvider::class
Passport 使⽤服务提供者注册内部的数据库迁移脚本⽬录,所以上⼀步完成后,你需要更新你的数据库结构。Passport 的迁移脚本会⾃动创建应⽤程序需要的客户端数据表和令牌数据表:
php artisan migrate
在.env 文件配置好数据库,这里不用多说了。laravel 5.4 改变了默认的数据库字符集,默认字符编码换成了
utf8mb4,这里还是说一下吧。
utf8的 varchar 类型字符串最长255,换成
utf8mb4最长是191,然而框架里面默认长度还是用的 255 导致长度不够了。
所以我们要修改app/Providers/AppServiceProvider.php :
use Illuminate\Support\Facades\Schema; public function boot() { Schema::defaultStringLength(191); }
然后运行artisan生成数据表:
php artisan make:auth //必须先运行这个,因为Passport 使用服务提供者注册内部的数据库迁移脚本目录 php artisan migrate //再更新
然后运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条命令也会创建「私人访问」客户端和「密码授权」客户端:
php artisan passport:install
然后Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中,这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用域:
<?php namespace App; use Laravel\Passport\HasApiTokens; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { protected $table = 'users'; //我的项目不知为啥要加入这个,不加这个就出错了,你们看自己情况 use HasApiTokens, Notifiable; }
接下来,需要在 AuthServiceProvider 的 boot 方法中调用 Passport::routes 函数。这个函数会注册一些在访问令牌、客户端、私人访问令牌的发放和吊销过程中会用到的必要路由:
<?php namespace App\Providers; use Laravel\Passport\Passport; //新增 class AuthServiceProvider extends ServiceProvider { public function boot() { $this->registerPolicies(); Passport::routes(); //新增 } }
配置文件 config/auth.php 中 api 部分的授权保护项( driver )改为 passport 。
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ],
添加路由
打开 routes/api.php 文件添加在这里,我们添加了,注册,登录 ,详情的路由
<?php Route::post('login', 'API\UserController@login'); Route::post('register', 'API\UserController@register'); Route::group(['middleware' => 'auth:api'], function(){ Route::post('details', 'API\UserController@details'); });
接着增加控制器,在APP/HTTP/Controller 目录新增一个专门的API文件夹放
G:\WWW\liangzengyun> php artisan make:controller Api/UserController
在UserController控制器中添加:
<?php namespace App\Http\Controllers\API; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use App\User; use Illuminate\Support\Facades\Auth; use Validator; class UserController extends Controller { public $successStatus = 200; /** * login api * * @return \Illuminate\Http\Response */ public function login(){ if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){ $user = Auth::user(); $success['token'] = $user->createToken('MyApp')->accessToken; return response()->json(['success' => $success], $this->successStatus); } else{ return response()->json(['error'=>'Unauthorised'], 401); } } /** * Register api * * @return \Illuminate\Http\Response */ public function register(Request $request) { $validator = Validator::make($request->all(), [ 'name' => 'required', 'email' => 'required|email', 'password' => 'required', 'c_password' => 'required|same:password', ]); if ($validator->fails()) { return response()->json(['error'=>$validator->errors()], 401); } $input = $request->all(); $input['password'] = bcrypt($input['password']); $user = User::create($input); $success['token'] = $user->createToken('MyApp')->accessToken; $success['name'] = $user->name; return response()->json(['success'=>$success], $this->successStatus); } /** * details api * * @return \Illuminate\Http\Response */ public function details() { $user = Auth::user(); return response()->json(['success' => $user], $this->successStatus); } }
接下来,我们测试 一下接口:
都能正常使用,
与dingo-api一起使用
你需要修改你的composer.json文件,然后执行
composer update把最后一个版本的包加入你的项目
"require": { "dingo/api": "2.0.0-alpha1" }
或者你可以在命令行执行
composer require命令
composer require dingo/api:2.0.0-alpha1
打开
config/app.php,注册必要的 service provider 在你的应用 providers
之前。
'providers' => [ Dingo\Api\Provider\LaravelServiceProvider::class ]
再次设置更改路由,
4000
打开 routes/api.php 文件添加
$api = app('Dingo\Api\Routing\Router'); $api->version('v1',function ($api) { $api->post('login', 'App\Http\Controllers\Api\UserController@login'); $api->post('register', 'App\Http\Controllers\Api\UserController@register'); $api->group(['middleware' => 'auth:api'], function($api){ $api->post('details', 'App\Http\Controllers\Api\UserController@details'); }); });
不多说,上图:
这里我们可以用刚才生成的Client ID与Client Secret来密码认证访问,也可以测试一下注册,登录 与详情页面,都能正常访问。(这几个页面的访问不变)。
到些大功告成,大家有问题可以提出交流一下,哈!!
相关文章推荐
- laravel 安装使用 Passport (Api认证)
- 详解laravel安装使用Passport(Api认证)
- laravel5.4使用Laravel Sms和阿里云短信服务实现短信验证码功能
- laravel5.4 使用tinker来实现数据填充测试
- laravel5.4使用socialite实现github登录
- laravel 5.4 + dingo api + jwt 代替Passport
- 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
- 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
- 在 Laravel 中使用 Laravel Searchy 扩展包实现基于数据库的轻量级搜索功能
- Laravel实现dingo+JWT api接口之配置篇
- 基于 Laravel 开发博客应用系列 —— 从测试开始(二):使用Gulp实现自动化测试
- Laravel通过Guzzel使用LeanCloud实现 实时通信
- 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能
- laravel使用phantomJS实现网页全屏截图
- Laravel5.3开发API(Dingo+Passport+Swagger)
- Laravel 5.4中使用Vuejs的坑
- 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能(转)
- Dingo + Laravel + JWT + Entrust + memcache 实现API设计
- laravel之dingoapi的使用
- 使用AngularJS和PHP的Laravel实现单页评论的方法