博客
关于我
passport 简易搭配
阅读量:796 次
发布时间:2023-02-26

本文共 4913 字,大约阅读时间需要 16 分钟。

前后端分离项目接口认证(Passport Laravel)

在前后端分离的项目中,前端如何通过接口进行认证是一个常见的问题。本文将详细介绍如何在Laravel框架中使用Passport包实现接口认证。

后端配置

  • 安装Passport包

    打开终端,执行以下命令安装Passport依赖包:

    composer require laravel/passport

    安装完成后,composer.json文件中会显示包的版本信息。

  • 注册Passport服务提供者

    打开config/app.php,在providers数组中添加Passport服务提供者:

    Laravel\Passport\PassportServiceProvider::class,
  • 执行数据库迁移

    运行以下命令,数据库会生成接口认证所需的表结构:

    php artisan migrate
  • 创建密码授权客户端

    使用以下命令创建一个密码授权客户端:

    php artisan passport:client --password

    创建完成后,会生成client_idclient_secret,前端登录时需要携带这两个参数。

  • 获取API密钥

    运行以下命令获取API密钥:

    php artisan passport:keys
  • 配置路由

    打开AuthServiceProvider,在boot方法中添加以下代码:

    use Laravel\Passport\Passport;public function boot(){    $this->registerPolicies();    Passport::routes();}

    打开config/auth.php,修改guards数组中的api驱动为passport

    'guards' => [    'web' => [        'driver' => 'session',        'provider' => 'users',    ],    'api' => [        'driver' => 'passport',        'provider' => 'customers',    ],],

    确保customers表是前端用户表,laravel默认使用user表时,需要自定义用户模型。

  • 注册中间件

    打开Kernel.php,在$routeMiddleware数组中添加以下中间件:

    protected $routeMiddleware = [    'client.credentials' => \Laravel\Passport\Http\Middleware\CheckClientCredentials::class,];

    在需要认证的接口路由文件routes/api.php中使用中间件:

    Route::group(['prefix' => 'cart', 'middleware' => 'client.credentials'], function () {    // 接口路由});
  • 用户模型配置

    Customer模型中添加以下用例:

    use Illuminate\Foundation\Auth\User as Authenticatable;use Laravel\Passport\HasApiTokens;class Customer extends Authenticatable{    use HasApiTokens;    // 其他模型配置}
  • 前端配置

  • 路由配置

    打开index.js,在路由数组中添加登录和注册路由:

    const routes = [    {        path: '/customer/login',        name: 'login',        component: () => import('../views/customer/Login.vue')    },    {        path: '/customer/register',        name: 'register',        component: () => import('../views/customer/Register.vue')    }    // 其他路由];
  • 登录组件开发

    Login.vue中实现用户登录功能:

  • 拦截器配置

    http.js中添加拦截器,判断用户是否登录:

    import axios from 'axios';import router from '@/router';axios.defaults.timeout = 5000;axios.defaults.baseURL = 'http://wechat.test/';axios.interceptors.request.use(config => {    config.headers.Authorization = `${localStorage.token_type} ${localStorage.access_token}`;    return config;}, error => {    return Promise.reject(error);});axios.interceptors.response.use(response => {    return response;}, error => {    if (error.response.status !== 200) {        alert('您还没有登录,请先登录');        router.push({ name: 'Login' });    }    return Promise.reject(error.response.data);});
  • 注册功能

    routes/api.php中添加注册路由:

    Route::namespace('Api')    ->group(function () {        Route::post('/register', 'HomeController@register');    });

    HomeController中实现注册接口:

    public function register(Request $request){    $email = $request->email;    $password = $request->password;    $check_password = $request->check_password;    if (!$email || !$password) {        return response()->json(['success' => false, 'message' => '邮箱或密码必填!']);    }    $pattern = "/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/";    if (!preg_match($pattern, $email)) {        return response()->json(['success' => false, 'message' => '邮箱格式不正确!']);    }    if ($check_password != $password) {        return response()->json(['success' => false, 'message' => '两次密码输入不一致!']);    }    $customer = Customer::where('email', $email)->first();    if ($customer) {        return response()->json(['success' => false, 'message' => '邮箱已被注册!']);    }    $password = \Hash::make($password);    $customer = Customer::create([        'email' => $email,        'password' => $password    ]);    return response()->json(['success' => true, 'message' => '注册成功!', 'customer' => $customer]);}
  • 注册组件开发

    Register.vue中实现注册功能:

  • 总结:接口认证逻辑

  • 安装Passport后,生成client_idclient_secret
  • 使用usernamepasswordclient_idclient_secretgrant_type参数,调用/oauth/token接口,获取access_token
  • 需要认证的接口,加上中间件。此时直接访问接口地址,会提示没有认证的。带上access_token后,才能拿到接口的数据。
  • 面试可以这样回答:

    接口认证,我们使用的是基于OAuth2服务的Passport依赖包,具体流程:

  • 后端执行命令安装Passport包,生成client_idclient_secret
  • 当用户访问认证接口时,带上所需参数,调用接口地址(oauth/token),获取access_token
  • 在需要认证的接口路由中加上路由中间件,此时前端访问接口地址时,会提示没有认证,即没有登录。当用户输入账号密码登录成功后,把access_tokentoken_type存入客户端的localStorage中,所有接口带上access_token后才能拿到接口数据。
  • 转载地址:http://kxvfk.baihongyu.com/

    你可能感兴趣的文章
    Openstack的视频学习
    查看>>
    openstack虚拟机迁移live-migration中libvirt配置
    查看>>
    ORACEL学习--理解over()函数
    查看>>
    oracle 10g的安装配置
    查看>>
    Oracle 11g数据库安装和卸载教程
    查看>>
    ORACLE Bug 4431215 引发的血案—原因分析篇
    查看>>
    oracle dblink 创建使用 垮库转移数据
    查看>>
    oracle dblink结合同义词的用法 PLS-00352:无法访问另一数据库
    查看>>
    Oracle dbms_job.submit参数错误导致问题(ora-12011 无法执行1作业)
    查看>>
    oracle dg switchover,DG Switchover fails
    查看>>
    Oracle EBS环境下查找数据源(OAF篇)
    查看>>
    Oracle GoldenGate Director安装和配置(无图)
    查看>>
    oracle script
    查看>>
    Oracle select表要带双引号的原因
    查看>>
    Oracle SOA Suit Adapter
    查看>>
    Oracle Spatial空间数据库建立
    查看>>
    UML— 活动图
    查看>>
    Oracle Statspack分析报告详解(一)
    查看>>
    oracle tirger_在Oracle中,临时表和全局临时表有什么区别?
    查看>>
    oracle where 条件的执行顺序分析1
    查看>>