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. (15)ServletConfig对象详解

    1,作用 主要是用于加载servlet的初始化参数.在一个web应用可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象) 2,创建时机和对象的获取 创 ...

  2. tcp与socket关系

    套接字(socket)是通信的基石,是支持TCP/IP协议的网络通信的基本操作单元.

  3. YTU 2928: 取不重复的子串。

    2928: 取不重复的子串. 时间限制: 1 Sec  内存限制: 128 MB 提交: 5  解决: 5 题目描述 输入字母构成的字符串(不大于30字符)从中读取3个不重复的字符,求所有取法,取出的 ...

  4. pybot执行多条用例时,某一个用例执行失败,停止所有用例的执行

    问题: pybot执行多条用例时,某一个用例执行失败,停止所有用例的执行 解决办法: pybot -exitonfailure E:\robot\呼送项目\测试用例\基本流程\主流程.txt 参考文章 ...

  5. zoj 3471(状态压缩DP,类似于点集配对)

    Most Powerful Time Limit: 2 Seconds      Memory Limit: 65536 KB Recently, researchers on Mars have d ...

  6. AWS EC2中部署Apache服务器(LAMP)

    关键词: 1.新建aws ec2实例 2.使用putty连接到aws ec2 实例(SSH协议) 3.使用filezilla连接到aws ec2实例(SFTP协议) 4.在aws ec2上部署apac ...

  7. Ruby module里的self

    创建: 2018/03/15 更新: 2018/03/22 把标题ruby首字母大写 都知道def self.方法名 来定义类方法 class SampleClass def self.class_m ...

  8. [App Store Connect帮助]七、在 App Store 上发行(1)App 发行流程概述

    在 App Store 上发行 App 的一般流程如下. 第 1 步:选择您的构建版本 每个 App 都可以有多个版本,且每个版本也可以有多个构建版本.若要在 App Store 上发行您的 App, ...

  9. 水题不AC,自挂二叉树——Chemist

    学长让我们刷USACO的水题果然是有道理的,做了四道挂了两道...细节处理一定要小心!大概都是NOIP Day1 T1的难度,但是一定要考虑全面否则还是凉凉啊. 一.USACO1.1贪婪的送礼者 题目 ...

  10. python服务之flask

    前言: 关于python flask 的介绍.指导.案例,网络上比比皆是.这里参考官网:http://www.pythondoc.com/flask/index.html 你可能不知道的flask服务 ...