laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证
第一部分:
安装passport
使⽤ Composer 依赖包管理器安装 Passport :
composer require laravel/passport
接下来,将 Passport 的服务提供者注册到配置⽂件 config/app.php 的providers 数组中:(5.6后不用加 )
Laravel\Passport\PassportServiceProvider::class
utf8
的 varchar 类型字符串最长255,换成utf8mb4
最长是191,然而框架里面默认长度还是用的 255 导致长度不够了。
所以我们要修改app/Providers/AppServiceProvider.php :
use Illuminate\Support\Facades\Schema; public function boot()
{
Schema::defaultStringLength(191);
}
在.env 和congfig/database.php文件配置好数据库
然后运行artisan生成数据表:
php artisan make:auth //必须先运行这个,因为Passport 使用服务提供者注册内部的数据库迁移脚本目录
php artisan migrate //再更新
然后运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条命令也会创建「私人访问」客户端和「密码授权」客户端:
php artisan passport:install
完成上面的步骤,我们可以配置一下Passport。
1. 在Model中,我们需要增加 HasApiTokens class,
2. 在AuthServiceProvider中, 增加 "Passport::routes()", 还可以增加过期时间
3. 在 auth.php中, 更改 api 认证方式为password.
1. app/User.php
namespace App; use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable
{
use HasApiTokens, Notifiable; /**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
]; /**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
}
2. app/Providers/AuthServiceProvider.php
namespace App\Providers; use Laravel\Passport\Passport;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
]; /**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(now()->addDays(30)); //这里设置为30天过期 Passport::refreshTokensExpireIn(now()->addDays(30));
} }
3. config/auth.php
return [
.....
.....
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',//这里做了修改
'provider' => 'users',
],
],
.....
.....
]
配置 routes/api.php ,增加相应API路由配置
Route::post('login', 'api\LoginController@login');
Route::post('register', 'api\LoginController@register'); Route::group(['middleware' => 'auth:api'], function(){
Route::post('details', 'api\LoginController@details');
});
创建controller ---》php artisan make:controller Api/LoginController
代码如下
class LoginController 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 = \App\User::create($input);//这里追踪到app/user.php
$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);
}
我们测试API使用Postman,在谷歌浏览器插件里可以安装它。
2. Login API
3. Get Detailss API
Now,我们来测试API数据获取, 我们需要添加headers在测试Postman中,$accessToken使用Login中的Token即可 格式 Authorization Bearer空格+token
第二部分:Dingo/Api v2.0+Passport实现api认证
1.在composer.json中添加
"require": {
"dingo/api": "2.0.0-alpha1"
}
2.在控制台中运行
php artisan vendor:publish --provider="Dingo\Api\Provider\LaravelServiceProvider"
在.env文件添加
API_STANDARDS_TREE=vnd # 公开的及商业项目用 vnd
API_SUBTYPE=api-demo # 项目简称
API_PREFIX=api # 前缀
API_VERSION=v1 # 不提供版本时使用的版本号
API_NAME="Laravel Api Demo" # 使用 API Blueprint 命令生成文档的时候才用到
API_STRICT=false # Strict 模式要求客户端发送 Accept 头而不是默认在配置文件中指定的版本,这意味着你不能通过Web浏览器浏览API
API_DEFAULT_FORMAT=json
API_DEBUG=false # 开启 debug 模式
打开 config/app.php
,注册必要的 service provider 在你的应用 providers 之前 5.6后可以不加
'providers' => [
Dingo\Api\Provider\LaravelServiceProvider::class
]
再次设置更改路由,
打开 routes/api.php 文件添加
$api = app('Dingo\Api\Routing\Router');
$api->version('v1',function ($api) {
$api->post('login', 'App\Http\Controllers\Api\LoginController@login');
$api->post('register', 'App\Http\Controllers\Api\LoginController@register');
$api->group(['middleware' => 'auth:api'], function($api){
$api->post('details', 'App\Http\Controllers\Api\LoginController@details');
});
});
这里我们可以用刚才生成的Client ID与Client Secret来密码认证访问,注册,登录 与详情页面,都能正常访问。(这几个页面的访问不变,程序代码不变)。 1.使用其他的数据表 例如test_user 只需在app/user.php中添加protected $table = 'test_user';
2.你可以自己定义你想要的登录验证字段
if(Auth::attempt(['id' => request('id'), 'password' => request('password')])){//这里修改为了id和密码
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')->accessToken;
return response()->json(['success' => $success], $this->successStatus);
}
else{
return response()->json(['error'=>'Unauthorised'], 401);
}
当然你也可以把app/user.php移动到app/Models下面 所有的数据模型文件,都 必须 存放在:app/Models/
文件夹中。这样更合理
然后修改
- 修改User.php的namespace为
App\Models
- 执行
composer dumpautoload
,重新加载类 - 将
config/auth.php
文件中的providers部分的model对应的类,修改为App\Models\User::
laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证的更多相关文章
- laravel Passport - Dingo/Api v2.0+Passport 实现 api 认证
第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...
- 第三节:dingo/API 最新版 V2.0 之 Creating API Endpoints (连载)
对于这篇文章的标题,其实,直译就是创建api端点.但是,真的很难懂,我还是写为API路由吧.每篇,文章,我都会全部去进行实践操作,力求写一个好点的教程. 本文英文地址——>https://git ...
- (弃)解读Openstack Identity API v2.0
目前OpenStack社区提供了详尽的API文档,并配有丰富的说明和示例,关于Identity API v2查看这里, 关于Identity API v3请查看这里. 尽管现在官方已经不建议OpenS ...
- Laravel 5.5 使用 Jwt-Auth 实现 API 用户认证以及刷新访问令牌
最近在做一个公司的项目,前端使用 Vue.js,后端使用 Laravel 构建 Api 服务,用户认证的包本来是想用 Laravel Passport 的,但是感觉有点麻烦,于是使用了 jwt-aut ...
- PHP Laravel 6.2 中用于用户登录的新密码确认流程
Laravel 发布了 v6.2 版本,它添加了一个新的密码确认功能,该功能使你可以要求已登录的用户重新输入密码,然后才能访问路由. 在你执行敏感操作的时候,这个功能就类似GitHub确认对话框.在 ...
- ASP.NET Web API(二):安全验证之使用HTTP基本认证
在前一篇文章ASP.NET Web API(一):使用初探,GET和POST数据中,我们初步接触了微软的REST API: Web API. 我们在接触了Web API的后就立马发现了有安全验证的需求 ...
- 给postgresql 创建新的用户
\du 查看当前postgresql的用户,一般此时只能看到 postgres create user ysr superuser password '123456'; \du 就可以看到两个用户了. ...
- laravel部署创建新项目 助记
打开进入homestead虚拟机,并进入code文件夹 cd ~/homestead && vagrant up && vagrant ssh cd ~/Code 进行 ...
- API网关设计(一)之Token多平台身份认证方案(转载)
原文:https://segmentfault.com/a/1190000018535570?utm_source=tag-newest 概述 今天咱们面对移动互联网的发展,系统一般是多个客户端对应一 ...
随机推荐
- hadoop2.6.5运行wordcount实例
运行wordcount实例 在/tmp目录下生成两个文本文件,上面随便写两个单词. cd /tmp/ mkdir file cd file/ echo "Hello world" ...
- 【Docker】 Swarm简单介绍
[Swarm] Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干台Docker主机抽象为一个整体,并且通过一个入口统一管理这些Docker主机上的各种Docker资源.Swarm ...
- 【Linux】 字符串和文本处理工具 grep & sed & awk
Linux字符串&文本处理工具 因为用linux的时候主要用到的还是字符交互界面,所以对字符串的处理变得十分重要.这篇介绍三个常用的字符串处理工具,包括grep,sed和awk ■ grep ...
- STL --> 高效使用STL
高效使用STL 仅仅是个选择的问题,都是STL,可能写出来的效率相差几倍: 熟悉以下条款,高效的使用STL: 一.当对象很大时,建立指针的容器而不是对象的容器 1)STL基于拷贝的方式的来工作,任 ...
- 数据库(Mongodb)
1.MongoClient()函数 In [8]: import pymongo In [9]: con = pymongo.MongoClient('localhost') #建立连接 In [10 ...
- 使用SQLiteOpenHelper类对数据库简单操作
实现数据库基本操作 数据库创建的问题解决了,接下来就该使用数据库实现应用程序功能的时候了.基本的操作包括创建.读取.更新.删除,即我们通常说的CRUD(Create, Read, Upda ...
- oracle、导出、导入
一.数据库导入: No1.查询所有表中那些是空表. select table_name from user_tables where NUM_ROWS=0; No2.拼接字符串生成SQL执行语句. s ...
- Jmeter返回参数值写入文件《一》
在用Jmeter做自动化测试的时候,某些特殊情况下我们需要将Jmeter的返回的某个特殊值写入的文件中,那么我们该如何做呢? 对于Jmeter这个工具来说,我们不难知道,它是一个java开源的可扩展的 ...
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
(1)synchronized 是互斥锁: (2)ReentrantLock 顾名思义 :可重入锁 (3)ReadWriteLock :读写锁 读写锁特点: a)多个读者可以同时进行读b)写者必须互斥 ...
- 云计算之路-阿里云上-容器难容:容器服务故障以及自建 docker swarm 集群故障
3月21日,由于使用阿里云服务器自建 docker swarm 集群的不稳定,我们将自建 docker swarm 集群上的所有应用切换阿里云容器服务 swarm 版(非swarm mode). 3月 ...