laravel5.7 前后端分离开发 实现基于API请求的token认证
最近在学习前后端分离开发,发现 在laravel中实现前后台分离是无法无法使用 CSRF Token 认证的。因为 web 请求的用户认证是通过Session和客户端Cookie的实现的,而前后端分离的应用无法通过API请求将Cookie 和 CSRF Token 从前端传递到后端,但是还有一种解决方法,就是使用laravel自带的 API token认证。
第一步:用户表添加api_token字段
1、可以通过数据迁移的方式添加,像这样:
php artisan make:migration --table=用户表名 add_api_token
然后编写这个迁移文件,文件位于 database/migration 中

class AddApiToken extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('用户表名', function (Blueprint $table) {
$table->string('api_token', 200)->unique()->nullable();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('用户表名', function (Blueprint $table) {
$table->dropColumn(['api_token']);
});
}
}
然后执行迁移命令
php artisan migrate
2、或者像我这样,直接在数据库用户表中添加,O(∩_∩)O哈哈~

因为 varchar 存储的是变长数据,也就是数据的真实长度,所以不要吝啬可以给长度设大点。
第二步、添加认证服务方
我是多表认证,每个用户角色有一张表,所以需要添加认证服务方,在 config/auth.php 中添加。一般使用已经默认的 api 认证方就好,


第三步、给用户模型添加生成api_token方法
/**
* 更新token
* @return mixed|string
*/
public function generateToken() {
$this->api_token = str_random(128);
$this->save();
return $this->api_token;
}
第四步、在控制器中添加登录方法
这是我的登录认证,是基于多表的用户认证,我是个小菜菜,细节就不给你们看了,怕你们喷我⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄。总之是在登陆验证成功之后,生成api_token并返回就可以了。

第五步、给路由添加认证中间件
在 api.php 添加如下路由,login 不需要守卫,给 logout 和 其他需要认证的路由添加守卫就可以了(auth:admin , 对应上面的admin用户)
Route::any('unAuth', function () {
return responseToJson(1,'未认证或认证失败');
})->name('unAuth');
Route::prefix('admin')->namespace('Admin')->group(function() {
Route::post('login', 'LoginController@login');
Route::middleware('auth:admin')->group(function() {
Route::post('logout', 'LoginController@logout');
Route::get('getMenu', 'MenuController@getMenu');
});
});

使用的是auth中间件,默认的路由我没有O(∩_∩)O,所以需要进行修改。
修改中间件 Authenticate.php , 位于 app/Http/Middleware/Authenticate.php 。
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
return route('unAuth');
}
}
}
现在就已经好了,在登陆之后会返回 api_token ,然后请求其他路由的时候把 api_token 当参数传过来。这样当请求需要认证的路由的时候如果没有 api_token 或者 api_token 错误,就会跳转到 unAuth 路由,然后返回定义好的提示信息。
第六步、退出时清除 token
public function logout()
{
$user = Auth::guard('admin')->user();
if ($user) {
$user->api_token = null;
$user->save();
}
return responseToJson(0,'退出成功');
}
还可以写个中间件,每隔一段时间更新一下 api_token 值,同时前端也要更新 api_token 。我写的也不是多好,可以看一下
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard)
{
$response = $next($request);
//验证token是否过期
$user = Auth::guard($guard)->user();
if (isTimeGreater($user->updated_token_at)){
$response->header("api_token", $user->generateToken());
}
return $response;
}
laravel5.7 前后端分离开发 实现基于API请求的token认证的更多相关文章
- Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置
前端网络访问,主流方案就是 Ajax,Vue 也不例外,在 Vue2.0 之前,网络访问较多的采用 vue-resources,Vue2.0 之后,官方不再建议使用 vue-resources ,这个 ...
- Aspnet Mvc 前后端分离项目手记(二)关于token认证
在前后端分离的项目中,首先我们要解决的问题就是身份认证 以往的时候,我们使用cookie+session,或者只用cookie来保持会话. 一,先来复习一下cookie和session 首先我们来复习 ...
- 基于RAP(Mock)实现前后端分离开发
看看RAP的官方定义: 什么是RAP? (Rigel API Platform) 在前后端分离的开发模式下,我们通常需要定义一份接口文档来规范接口的具体信息.如一个请求的地址.有几个参数.参数名称及类 ...
- 超简单工具puer——“低碳”的前后端分离开发
本文由作者郑海波授权网易云社区发布. 前几天,跟一同事(MIHTool作者)讨教了一下开发调试工具.其实个人觉得相较于定制一个类似MIHTool的Hybrid App容器,基于长连的B/S架构的工具其 ...
- Web前后端分离开发(CRUD)及其演变概括
今天学习了前后端分离开发模式又从网上查了一些资料就写了一篇博客分享: 一.为什么分离前后端 1.1早期开发 1.2后段为主mvc模式 1.2.1Structs框架介绍 1.2.2Spring mcv开 ...
- vue+mockjs 模拟数据,实现前后端分离开发
在项目中尝试了mockjs,mock数据,实现前后端分离开发. 关于mockjs,官网描述的是 1.前后端分离 2.不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据. 3.数据类型丰 ...
- 如何利用vue和php做前后端分离开发?
新手上路,前端工程师,刚毕业参加工作两个月,上面让我用vue搭建环境和php工程师一起开发,做前后端分离,然而我只用过简单的vue做一些小组件的经验,完全不知道怎样和php工程师配合,ps: php那 ...
- SpringBoot,Vue前后端分离开发首秀
需求:读取数据库的数据展现到前端页面 技术栈:后端有主要有SpringBoot,lombok,SpringData JPA,Swagger,跨域,前端有Vue和axios 不了解这些技术的可以去入门一 ...
- Springboot前后端分离开发
.1.springboot前后端分离开发之前要配置好很多东西,这周会详细补充博客内容和遇到的问题的解析 2,按照下面流程走一遍 此时会加载稍等一下 pom.xml显示中加上阿里云镜像可以加速下载配置文 ...
随机推荐
- BZOJ5254 : [Fjwc2018]红绿灯
显然所有询问都要经过至少$\sum d$,只需要考虑除了$\sum d$之外的等待红灯的时间. 将所有询问的时间模$g+r$,并按时间用set维护. 那么对于每个红灯,在set中可以找出$1$到$2$ ...
- c#清空数组&初始化数组&动态数组
清空数组>>>Array.Clear [去MSDN查看] ]; ; i < str.Length; i++) str[i] = i.ToString(); Array.Clea ...
- sql测验,like 和 = 的区别
.SQL 指的是? 您的回答:Structured Query Language .哪个 SQL 语句用于从数据库中提取数据? 您的回答:SELECT .哪条 SQL 语句用于更新数据库中的数据? 您 ...
- 元素定位(d4-2)
一,元素定位①优先级:首先选择id,其次选class,再就是根据其他唯一元素,在更加层级过滤定位,根据多属性定位,②首选CSS定位,在选XPATH定位 1.xpath定位 //* 获取当前网页全部 ...
- 更改checkbox样式css
checkbox { width: 20px; height: 20px; background-color: #d6bfa6; border: #d6bfa6; -webkit-border-r ...
- android发送短信验证码并自动获取验证码填充文本框
android注册发送短信验证码并自动获取短信,截取数字验证码填充文本框. 一.接入短信平台 首先需要选择短信平台接入,这里使用的是榛子云短信平台(http://smsow.zhenzikj.com) ...
- ASP.NET 创建WebService——简单例子
Web service是一个基于可编程的web的应用程序,用于开发分布式的互操作的应用程序,也是一种web服务 WebService的特性有以下几点: 1.使用XML(标准通用标记语言)来作为数据交互 ...
- git命令行在windows中报错WARNING: terminal is not fully functional
今天在windows的PowerShell中执行git log命令的时候报错: WARNING: terminal is not fully functional 网上查找方法,最后 1.打开wind ...
- Cassandra数据模型
Ⅰ.数据模型 1.1 Column 一组包含Name/Value Pair的数据叫Row,其中每一组Name/Value Pair叫Column Column是Cassandra最基本的数据结构,它是 ...
- doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https://blackhole.m.jd.com/getinfo
doubleclick cookie https://mp.weixin.qq.com/s/vZUj-Z9FGSSWXOodGqbYkA 揭密Google的网络广告技术:基于互联网大数据视角 原创: ...