代码改变世界

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

 

 
migrate.png

注:现在的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 文件添加注册,登录 ,用户详情的路由


 
routes.png

然后添加控制器,这里我在Controller下创建了Api的子文件夹


 
Controller.png

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']);
        $input['avatar']               = '/images/avatars/default.jpg';
        $input['emailverfiy_token']    = '';
        $input['state']                = 1;
        $user                          = User::create($input);
        $success['token']              = $user->createToken('MyApp')->accessToken;
        $success['name']               = $user->name;

        return Response()->json(['success'=>$success],$this->SuccessCode);
    }

    /**
     * get user infomation function
     *
     * @return void
     */
    public function details()
    {
        $user = Auth::user();  
        return response()->json(['success' => $user], $this->successStatus);
    }
}

接口测试

  • 注册接口:


     
    注册接口.png
  • 登陆接口


     
    登陆接口.png
  • 用户信息接口


     


作者:千年面包
链接:https://www.jianshu.com/p/8580f7c3ae11
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。