Laravel5.6 + Passport实现Api接口认证

栏目: 编程语言 · PHP · 发布时间: 6年前

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

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

后端(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后,才能拿到接口的数据。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Form Design

Web Form Design

Luke Wroblewski / Rosenfeld Media / 2008-5-2 / GBP 25.00

Forms make or break the most crucial online interactions: checkout, registration, and any task requiring information entry. In Web Form Design, Luke Wroblewski draws on original research, his consider......一起来看看 《Web Form Design》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具