GQ1994 关注

2018.04.20 09:31 字数 1152 阅读 1316评论 0喜欢 1
参考链接

Laravel 的 API 认证系统 Passport 三部曲(一、passport安装+配置)

Laravel 的 API 认证系统 Passport

引言

  1. 在使用前要先了解Auth2.0的使用方式和原理Laravel 的用户认证系统
  2. passport是专门做api令牌授权的工具,这里有个问题是他不像auth一样可以定义多个guard来区分不同平台走不同的auth认证模块,他默认只走guard=api这个api认证模块。

密码授权令牌的获取

  • 请求令牌
    创建密码授权的客户端后,就可以通过向用户的电子邮件地址和密码向 /oauth/token 路由发出 POST 请求来获取访问令牌。而该路由已经由 Passport::routes 方法注册,因此不需要手动定义它。如果请求成功,会在服务端返回的 JSON 响应中收到一个 access_token 和 refresh_token:

    $http = new GuzzleHttp\Client;
    
    $response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
    'grant_type' => 'password',
    'client_id' => 'client-id',
    'client_secret' => 'client-secret',
    'username' => 'taylor@laravel.com',
    'password' => 'my-password',
    'scope' => '',
    ],
    ]); return json_decode((string) $response->getBody(), true);

私人访问令牌

在你的应用程序发布个人访问令牌之前,你需要在 passport:client 命令后带上 --personal 参数来创建对应的客户端。如果你已经运行了 passport:install 命令,则无需再运行此命令:

php artisan passport:client --personal

创建个人访问客户端后,你可以使用 User 模型实例上的 createToken 方法来为给定用户发布令牌。
createToken 方法接受令牌的名称作为其第一个参数和可选的 作用域 数组作为其第二个参数:

$user = App\User::find(1);

// Creating a token without scopes...
$token = $user->createToken('Token Name')->accessToken; // Creating a token with scopes...
$token = $user->createToken('My Token', ['place-orders'])->accessToken;

注意: 由于passport默认只可以走一个guard认证,当多平台的时候,可以使用auth2.0来辅助操作,首先使用Auth2.0验证该平台对应的guard(当然,驱动使用session))下其账号密码是否正确,验证通过之后再获取该用户实例并给予私人访问令牌,这样就做到了不同平台的令牌生成)

验证令牌

  • 通过中间件

    Passport 包含一个 验证保护机制 可以验证请求中传入的访问令牌。配置 api 的看守器使用 passport 驱动程序后,只需要在需要有效访问令牌的任何路由上指定 auth:api 中间件:

    Route::get('/user', function () {
    //
    })->middleware('auth:api');
  • 我们实现方式

    由于passport只可以走api一个guard验证,也就是只可以走一个用户授权表,这里我们多平台多登陆授权表则只用上面的验证登陆肯定就不对了,如上所说我们结合auth2.0来进行分平台进行验证。

    1. 首先创建一个AuthApi中间键
    2. 在/app/Http/Kernel.php中注册AuthApi中间键

    eg:

    public function handle($request, Closure $next, $guard = null)
    {
    if (empty(Auth::guard($guard)->user())) {
    return response()->json(["message" => "Unauthenticated."], 401);
    } return $next($request);
    }

    protected $routeMiddleware = [
    'apiAuth' => ApiAuth::class,
    ......
    ];

    1. 使用的时候比如要使用guard=home的验证令牌,则中间件为“apiAuth:home”即可

注销登录、定期检查过期token,销毁旧的token

  • 注销登录

    eg:

    /**
    * 登出程序操作.
    *
    * @return \Illuminate\Http\Response
    */
    public function logout()
    {
    $user = $this->guard()->user();
    if (empty($user)) {
    return $this->sendError('暂未登录', ['暂未登录'], 403);
    } // 获取当前登陆用户的access_token的id
    $accessToken = $user->access_token; // 找到这条access_token并且将其删除
    $token = Token::find($accessToken);
    if (empty($token)) {
    return $this->sendError('暂无有效令牌', ['暂无有效令牌'], 403);
    } if (!empty($token->delete())) {
    return $this->sendResponse([], '退出成功!');
    } else {
    return $this->sendError('退出失败', ['退出失败'], 500);
    }
    }
  • 定期检查过期token(官方文档没给,个人做的优化)

    • 创建token生成事件的监听器来处理该用户当前客户端下的所有失效的token

      在“/app/Providers/EventServiceProvider.php”中的“$listen”数组中添加

      // 生成token,检查失效的进行删除
      'Laravel\Passport\Events\AccessTokenCreated' => [
      'App\Listeners\RevokeOldTokens',
      ],

      终端执行:

      php artisan event:generate

      提示:"Events and listeners generated successfully!"代表创建成功了

    • 执行删除失效token操作

      在 'App\Listeners\RevokeOldTokens'的handle方法中执行删除失效token操作

      Token::where('id', '!=', $event->tokenId)
      ->where('user_id', $event->userId)
      ->where('client_id', $event->clientId)
      ->where('expires_at', '<', Carbon::now())
      ->orWhere('revoked', true)
      ->delete();

Laravel 的 API 认证系统 Passport 三部曲(二、passport的具体使用)的更多相关文章

  1. 单点登录 - API 认证系统 Passport(二)

    安装 composer require laravel/passport=~4.0 notes: 1)确保系统安装unzip.zip等命令. 2)composer 安装出现 Authenticatio ...

  2. [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。

    1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...

  3. Laravel核心解读 -- 扩展用户认证系统

    扩展用户认证系统 上一节我们介绍了Laravel Auth系统实现的一些细节知道了Laravel是如何应用看守器和用户提供器来进行用户认证的,但是针对我们自己开发的项目或多或少地我们都会需要在自带的看 ...

  4. Laravel Passport API 认证使用小结

    Laravel Passport API 认证使用小结 八月 4, 2017 发布在 Laravel 看到Laravel-China 社区常有人问 Laravel Passport 用于密码验证方式来 ...

  5. laravel Passport - 创建 REST API 用户认证以及Dingo/Api v2.0+Passport实现api认证

    第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...

  6. Laravel 5.4建站06--API 认证系统 Passport

    介绍 在 Laravel 中,实现基于传统表单的登陆和授权已经非常简单,但是如何满足 API 场景下的授权需求呢?在 API 场景里通常通过令牌来实现用户授权,而非维护请求之间的 Session 状态 ...

  7. laravel Passport - Dingo/Api v2.0+Passport 实现 api 认证

    第一部分: 安装passport 使⽤ Composer 依赖包管理器安装 Passport : composer require laravel/passport 接下来,将 Passport 的服 ...

  8. laravel使用JWT做API认证

    最近项目做API认证,最终技术选型决定使用JWT,项目框架使用的是laravel,laravel使用JWT有比较方便使用的开源包:jwt-auth.php 后端实现JWT认证方法 使用composer ...

  9. Laravel用户认证系统的实现细节

    原文地址:http://www.php.cn/php-weizijiaocheng-406076.html 这篇文章主要介绍了关于Laravel用户认证系统的实现细节,有着一定的参考价值,现在分享给大 ...

随机推荐

  1. POJ2528 Mayor's posters —— 线段树染色 + 离散化

    题目链接:https://vjudge.net/problem/POJ-2528 The citizens of Bytetown, AB, could not stand that the cand ...

  2. ubuntu mysql5.7源码安装

    本系列的lnmp的大框架基本上是按照http://www.linuxzen.com/lnmphuan-jing-da-jian-wan-quan-shou-ce-si-lnmpda-jian-yuan ...

  3. linux块设备模型架构框架

    Linux块设备的原理远比字符设备要复杂得多,尽管在linux这一块的方法论有很多相似之处,但考虑到它是用中块结构,它常常要搭配内存页管理,页缓冲块缓冲来改善硬盘访问的速度,按照块硬件最大的性能要求进 ...

  4. Python3列表、元组、字典、集合的方法

    一.列表 温馨提示:对图片点右键——在新标签页中打开图片: 1.count() 定义:统计指定元素在列表中出现的次数并返回这个数.若指定的元素不存在则返回:0. 格式:[列表].count(“指定元素 ...

  5. shell 与 空格

    shell脚本中,不能随意添加空格,否则出错: 1,=等号两边必须无空格.否则出错.如i =$1和i= $1都是错的.但是在()内部不限制如for ((i= 1;i < 3;i= i+1))是正 ...

  6. hdu5410(完全背包变形)

    这是道完全背包,关键点在于如何处理每种物品,第一次放时,价值为A+B,以后放时,价值为A. 所以有三种决策,对于第i种物品,要么不放,要么是作为第一个放,要么是第二个以后放. 作为第一个放时,需要用到 ...

  7. (转)Repeater中增加序号自增列

    <%# Convert.ToString(Container.ItemIndex+)%> 当Repeater空为时,提示没有数据... <FooterTemplate> < ...

  8. UVa 11401 Triangle Counting (计数DP)

    题意:给定一个数 n,从1-n这些数中任意挑出3个数,能组成三角形的数目. 析:dp[i] 表示从1-i 个中任意挑出3个数,能组成三角形的数目. 代码如下: #pragma comment(link ...

  9. Win7下安装MongoDB4.0.10

    前言 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什 ...

  10. Quartz.Net实现的定时执行任务调度

    在之前的文章<推荐一个简单.轻量.功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler>和<简单.轻量.功能非常强大的C#/ASP.NET定时调度 ...