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. “Invalid configuration file. File "I:/My Virtual Machines/Windows XP english Professional/Windows XP Professional.vmx" was created by a VMware product

    “Invalid configuration file. File "I:/My Virtual Machines/Windows XP english Professional/Windo ...

  2. YTU 2553: 谁是赢家

    2553: 谁是赢家 时间限制: 1 Sec  内存限制: 128 MB 提交: 94  解决: 25 题目描述 某一天,hcbbt等一群弱菜去tamara巨巨家里一起玩了一个卡牌游戏.巨 巨家里有2 ...

  3. 数据库sqlite3的使用-Navicat的安装

    一:Navicat Navicat是一款著名的数据库管理软件,支持大部分主流数据库(包括SQLite) 1.Navicat的安装 (1)下载该软件后,先打开该软件 (2)把文件拖入到应用程序拷贝 (3 ...

  4. C语言-1.static 和 extern使用,2.文件,3.数据块读写

    1.static 和 extern使用, 1)修饰局部变量 static修饰局部变量特点:延长局部变量的生命周期 ,static修饰的局部变量只会被执行一次 extern不能修饰局部变量 2)修饰全局 ...

  5. Watir: element_by_xpath 的使用

    b =Watir::IE.new b.goto'http://www.google.com/' txt =b.element_by_xpath("//*[@name='q']") ...

  6. bzoj4289 PA2012 Tax——点边转化

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4289 好巧妙的转化!感觉自己难以想出来... 参考了博客:https://blog.csdn ...

  7. 洛谷P2943 清理——DP

    题目:https://www.luogu.org/problemnew/show/P2943 一眼看去就有个 n^2 的做法:f[i] = min{ f[j] + num( i - j ) * num ...

  8. 《StarGAN: Unified Generative Adversarial Networks for Multi-Domain Image-to-Image Translation》论文笔记

    ---恢复内容开始--- Motivation 使用单组的生成器G和判别训练图片在多个不同的图片域中进行转换 效果确实很逆天,难怪连Good Fellow都亲手给本文点赞 Introduction 论 ...

  9. maven仓库错误

    1.jai_core 时间:2018年3月21日10:04:57 URL:https://mvnrepository.com/artifact/javax.media/jai_core/1.1.3 / ...

  10. 工作日记:C#获取操作系统、MAC地址、登录用户、网卡、物理内存信息

    /// <summary> /// 操作系统的登录用户名 /// </summary> /// <returns>系统的登录用户名</returns> ...