Laravel使用Passport 实现api认证--https://www.jianshu.com/p/8580f7c3ae11
2020-03-12 14:56 ly772186472 阅读(412) 评论(0) 编辑 收藏 举报1、安装passport
首先通过 Composer 包管理器安装 Passport
composer require laravel/passport
生成auth相关:
php artisan make:auth
接下来,将 Passport 的服务提供者注册到配置⽂件 config/app.php 的providers 数组中:
'providers' => [
......
Laravel\Passport\PassportServiceProvider::class
Passport 服务提供器使用框架注册自己的数据库迁移目录,因此在注册提供器后,就应该运行 Passport 的迁移命令来自动创建存储客户端和令牌的数据表:
php artisan migrate
注:现在的laravel版本默认字符编码为utf8mb4。utf8 的 varchar 类型字符串最长255,换成utf8mb4最长是191,然而框架里面默认长度还是用的 255 所以会导致长度不够
下面来修改app/Providers/AppServiceProvider.php:
namespace App\Providers;
use Laravel\Passport\Passport;
use Illuminate\Support\ServiceProvider;
use Schema;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// set utf8mb4 length
Schema::defaultStringLength(191);
// Register auth routes
Passport::routes();
}
然后运行 passport:install 命令来创建生成安全访问令牌时用到的加密密钥,同时,这条命令也会创建「私人访问」客户端和「密码授权」客户端:
php artisan passport:install
然后Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中,这个 Trait 会给你的模型提供一些辅助函数,用于检查已认证用户的令牌和使用作用域:
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens,Notifiable;
protected $table = 'users';
配置文件 config/auth.php 中 api 部分的driver改为 passport 。
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
2、添加路由
打开 routes/api.php 文件添加注册,登录 ,用户详情的路由
然后添加控制器,这里我在Controller下创建了Api的子文件夹
UserController代码如下:
<?php
namespace App\Http\Controllers\Api;
use Validator;
use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
class UserController extends Controller
{
// successCode
public $SuccessCode = 200;
/**
* login function
*
* @return void
*/
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->SuccessCode);
}else{
return Response()->json(['error'=>'Unauthorised'],401);
}
}
/**
* register function
*
* @param Request $request
* @return void
*/
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'