详解Laravel5.6 Passport实现Api接口认证


Posted in PHP onJuly 27, 2018

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

后端(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 $routeMiddleware = [
'client.credentials'=>\Laravel\Passport\Http\Middleware\CheckClientCredentials::class,
];

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

Route::group(['prefix' => 'cart', 'middleware' => ['client.credentials']], function () {
  ...
});

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

详解Laravel5.6 Passport实现Api接口认证 

前端(vue.js)

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

1. 配置路由,在 index.js 文件中写入如下代码

import Login from '@/components/customer/Login'
export default new Router({
 routes: [
    ....
  {
   path: '/customer/login',
   name: 'Login',
   component: Login
  },
 ]
})

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

<template>
 <div>
  <input type="email" v-model="customer.email" placeholder="请输入邮箱">
  <input type="password" v-model="customer.password" placeholder="请输入密码">
  <button @click.prevent="submit">登 录</button>
 </div>
</template>

<script>
 export default {
  data() {
   return {
    customer: {
     email: '',
     password: ''
    }
   }
  },
  methods: {
   submit() {
    //将数据配置好
    const data = {
     grant_type: 'password', //oauth的模式
     client_id: 1,  //上面所说的client_id
     client_secret: 'CO331cA1mqiKgGvvgiDzPxh4CUu19vSEiqxM7LHD',//同上
     username: this.customer.email,
     password: this.customer.password,
    }
    this.axios.post('/oauth/token', data)
     .then(res => {
      if (res.status == 200) { //如果成功了,就把access_token存入localStorage
       localStorage.token_type = res.data.token_type
       localStorage.access_token = res.data.access_token
       this.$router.push({name:'Index'})
      }
     })
   }
  }
 }
</script>

客户端查看 localStorage ,如图:

详解Laravel5.6 Passport实现Api接口认证

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 => {
  // 401 清除token信息并跳转到登录页面
  if (error.response.status == 401) {
   alert('您还没有登录,请先登录')
   router.replace({  //如果失败,跳转到登录页面
    name: 'Login'
   })
  }
  return Promise.reject(error.response.data)
 });

export default axios;

重新访问项目,在商品详情页面点击加入购物车,你会发觉奇迹已经出现,当你没有登录时,提示跳转到登录页面。输入账号密码,登录成功,此时就能拿到用户id。接下来,继续测试。

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

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

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

详解Laravel5.6 Passport实现Api接口认证

详解Laravel5.6 Passport实现Api接口认证

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

总结:接口认证逻辑思想

1、安装passport后,生成client_id和 client_secret

2、使用username、password、client_id、client_secret、grant_type参数,调用/oauth/token接口,拿到access_token

3、需要认证的接口,加上中间件。这时候直接访问接口地址,会提示没有认证的。带上access_token后,才能拿到接口的数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
我的论坛源代码(九)
Oct 09 PHP
php 中英文语言转换类代码
Aug 11 PHP
去除php注释和去除空格函数分享
Mar 13 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
Oct 01 PHP
WordPress分页伪静态加html后缀
Jun 08 PHP
php删除数组指定元素实现代码
May 03 PHP
php基于SQLite实现的分页功能示例
Jun 21 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
实例说明js脚本语言和php脚本语言的区别
Apr 04 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 PHP
PHP 自动加载类原理与用法实例分析
Apr 14 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 PHP
PHP实现的DES加密解密类定义与用法示例
Nov 02 #PHP
详解laravel安装使用Passport(Api认证)
Jul 27 #PHP
Ubuntu彻底删除PHP7.0的方法
Jul 27 #PHP
PHP实现的CURL非阻塞调用类
Jul 26 #PHP
PHP等比例压缩图片的实例代码
Jul 26 #PHP
PHP实现非阻塞模式的方法分析
Jul 26 #PHP
php实现等比例压缩图片
Jul 26 #PHP
You might like
利用php+mcDropdown实现文件路径可在下拉框选择
2013/08/07 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
javascript正则表达式中参数g(全局)的作用
2010/11/11 Javascript
jquery.Ajax()方法调用Asp.Net后台的方法解析
2014/02/13 Javascript
javascript使用smipleChart实现简单图表
2015/01/02 Javascript
javascript实现图像循环明暗变化的方法
2015/02/25 Javascript
jQuery+AJAX实现无刷新下拉加载更多
2015/07/03 Javascript
JavaScript的Ext JS框架中的GridPanel组件使用指南
2016/05/21 Javascript
html中鼠标滚轮事件onmousewheel的处理方法
2016/11/11 Javascript
Javascript 引擎工作机制详解
2016/11/30 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
JS搜狐面试题分析
2016/12/16 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
详解supervisor使用教程
2017/11/21 Python
Python爬虫实例_城市公交网络站点数据的爬取方法
2018/01/10 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
PyQt5实现简单的计算器
2020/05/30 Python
使用CSS3美化HTML表单的技巧演示
2016/05/17 HTML / CSS
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
用你熟悉的语言写一个连接ORACLE数据库的程序,能够完成修改和查询工作
2012/06/11 面试题
什么是数据库锁?Oracle中都有哪些类型的锁?
2015/08/21 面试题
EJB发布WEB服务一般步骤
2012/10/31 面试题
安全资料员岗位职责
2013/12/14 职场文书
运动会广播稿100字
2014/01/11 职场文书
社区优秀志愿者材料
2014/02/02 职场文书
质量承诺书范文
2014/03/27 职场文书
《花瓣飘香》教学反思
2014/04/15 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
物业消防安全责任书
2014/07/23 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
2015年统战工作总结
2015/05/19 职场文书
家庭教育教师培训学习体会
2016/01/14 职场文书
解决xampp安装后Apache无法启动
2022/03/21 Servers