passport 简易搭配
发布日期:2025-05-01 22:40:43 浏览次数:2 分类:技术文章

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

很多企业做项目使用前后端分离,后端提供接口地址,前端使用接口地址拿数据,并渲染页面。那么,前端用户登录如何使用接口进行认证?网上各种教程写的不堪入目,完全看不懂,所以我根据自己的理解,写下此篇文章,希望能帮助到大家。 ##后端(Laravel5.6框架)

1、使用composer安装Passport,打开终端,执行命令:

composer require laravel/passport   #安装完成后,在composer.json文件中会看到文件版本信息

2、接下来,将Passport的服务提供者注册到配置文件config/app.phpproviders数组中

Laravel\Passport\PassportServiceProvider::class,

3、执行数据库迁移

php artisan migrate  #数据库中会生成接口认证所需的5张表

4、创建密码授权客户端

php artisan passport:client --password#创建了client_id和client_secret,前端登录验证的时候必须把这两个玩意儿带着

5、获取keys

php artisan passport:keys

6、配置路由 打开服务提供者AuthServiceProvider, 在boot方法中加入如下代码:

use Laravel\Passport\Passport;public function boot() {     $this->registerPolicies();      Passport::routes(); //接口认证的路由}

然后将配置文件config/auth.php中授权看守器guardsapidriver选项改为passport 我这里的customer表是前端用户表,但是laravel默认的是user表,所以这里需要做如下配置:

'guards' => [    'web' => [        'driver' => 'session',        'provider' => 'users',    ],    'api' => [        'driver' => 'passport',        'provider' => 'customers',    ],],
'providers' => [    'users' => [        'driver' => 'eloquent',        'model' => App\User::class,    ],    'customers' => [        'driver' => 'eloquent',        'model' => App\Models\Shop\Customer::class,    ],],

7、注册中间件,在app/Http/Kernel.php文件中的$routeMiddleware数组中添加如下中间件

protected $middleware = [    \App\Http\Middleware\CheckForMaintenanceMode::class,    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,    \App\Http\Middleware\TrimStrings::class,    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,    \App\Http\Middleware\TrustProxies::class,    \Barryvdh\Cors\HandleCors::class,];**********************************************************************protected $routeMiddleware = ['client.credentials'=>\Laravel\Passport\Http\Middleware\CheckClientCredentials::class,];

然后在需要认证接口路由文件routes/api.php前面加上这个中间件。

Route::group(['prefix' => 'cart', ['middleware' => 'client.credentials']], function () {  // laravel6.0以数组形式定义// Route::prefix('cart')->middleware('client.credentials')->group(function(){   // laravel5.6以对象形式定义    ...});

8、前端用户表customer模型里面做如下配置:

use Illuminate\Foundation\Auth\User as Authenticatable;use Laravel\Passport\HasApiTokens;class Customer extends Authenticatable{    use HasApiTokens;     ....   }

至此,后端的所有配置已完成。

接下来,打开接口测试工具(postman),输入接口地址:wechat.test/oauth/token,请求类型 POST,填上如下参数,点击 send 你会看到后台返回了前端所需的access_token: 

##前端(vue.js)

首先去加载用户登录组件,即用户登录页面。

  1. 配置路由,在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')    },    .    .  ]})

2、加载组件,在customer文件夹的Login.vue文件中写入如下代码:

3、在http.js文件中设置拦截器,用于判断用户是否登录,若没有登录跳转到登录页面。代码如下:

//#创建http.js文件import axios from 'axios'import router from '@/router'// axios 配置axios.defaults.timeout = 5000;axios.defaults.baseURL = 'http://wechat.test/';// http request 拦截器axios.interceptors.request.use(  config => { //将所有的axios的header里加上token_type和access_token    config.headers.Authorization = `${localStorage.token_type} ${localStorage.access_token}`;    return config;  },  err => {    return Promise.reject(err);  });// http response 拦截器axios.interceptors.response.use(  response => {    return response;  },  error => {    // 如果不是200, 清除token信息并跳转到登录页面    if (error.response.status != 200) {      alert('您还没有登录,请先登录')      router.push({    //如果失败,跳转到登录页面        name: 'Login'      })    }    return Promise.reject(error.response.data)  });export default axios;

重新访问项目,在商品详情页面点击加入购物车,你会发觉奇迹已经出现,当你没有登录时,提示跳转到登录页面。输入账号密码,登录成功,浏览器查看 localStorage,如图:

此时就能拿到用户id。接下来,继续测试。

4、去Cart控制器中,找到购物车首页方法,获取用户的id,获取方式如下:

$customer_id = auth('api')->user()->id;return $customer_id;

5、在postman中输入购物车首页接口地址,并传入所需参数,参数参考地址:http://laravelacademy.org/post/8909.html,如下:

'headers' => [    'Accept' => 'application/json',    'Authorization' => 'Bearer '.$accessToken,],

测试结果如图:

拿到用户id后,把后端之前定义的customer_id全部改为通过接口方法获取。至此,Passport接口认证的全部操作已完成。

接下来去完成用户注册功能

首先在后端 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]);}

postman 接口测试如图:

接下来,去 vue 那边写个注册的路由,上面的代码已完成!

前端注册页面参考代码如下:

各种测试,测试成功后,customers 表里面就应该有一个新的用户了。

Tips:如果你在项目中跑passport命令执行报错的话,可参考这篇文章来解决问题:https://laravel-china.org/topics/16245

##总结:接口认证逻辑思想

1、安装passport后,生成client_id和 client_secret 2、使用usernamepasswordclient_idclient_secretgrant_type参数,调用/oauth/token接口,拿到access_token 3、需要认证的接口,加上中间件。这时候直接访问接口地址,会提示没有认证的。带上access_token后,才能拿到接口的数据。

面试可以这样回答: 接口认证,我们使用的是基于oauth2服务中的passport依赖包,具体流程: 1、后端执行命令安装passport包,生成client_id和 client_secret 2、当用户访问认证接口时,带上所需参数,调用接口地址(oauth/token),获取access_token 3、在需要认证的接口路由中加上路由中间件,此时前端访问接口地址时,会提示没有认证,即没有登录,当用户输入账号密码登录成功后,把access_token和token_type存入客户端的localStorage中,所有接口带上access_token 后才能拿到接口数据。

转载请注明,来自

上一篇:passwd命令限制用户密码到期时间
下一篇:Passport 授权码模式

发表评论

最新留言

不错!
[***.144.177.141]2025年04月03日 12时55分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章