Laravel 的 API 认证系统 Passport 三部曲(二、passport的具体使用)

news/2025/2/2 1:46:21/

 

96 
GQ1994 
2018.04.20 09:31 字数 1152 阅读 1316评论 0
参考链接

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();

转载于:https://www.cnblogs.com/guiyishanren/p/10757623.html


http://www.ppmy.cn/news/618741.html

相关文章

Nodejs Passport 系列之四:Passport 源码剖析之 OAuth2 认证流程

前言 本文是笔者所总结的有关 Nodejs Passport 系列之一&#xff1b;本文将从源码分析的角度&#xff0c;来深入剖析 passport 的认证流程&#xff1b; 本文为作者原创作品&#xff0c;转载请注明出处&#xff1b; 综述 OAuth2orize 包模块扩展使得 Express 成为具备 OAuth…

建立无需build的react单页面SPA框架

vue、react这种前端渲染的框架&#xff0c;比较适合做SPA。如果用ejs做SPA&#xff08;Single Page Application&#xff09;&#xff0c;js代码控制好全局变量冲突不算严重&#xff0c;但dom元素用jquery操作会遇到很多的名称上的冲突&#xff08;tag、id、name&#xff09;。…

DAY34——贪心part3

1. class Solution {public int largestSumAfterKNegations(int[] nums, int K) {// 将数组按照绝对值大小从大到小排序&#xff0c;注意要按照绝对值的大小nums IntStream.of(nums).boxed().sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)).mapToInt(Integer::intValue)…

乱世王者服务器维护,乱世王者千变万化开服时间表_乱世王者新区开服预告_第一手游网手游开服表...

2021-07-16 11:00 微信641区虎啸风生 已经开服 2021-07-10 11:00 微信640区霸王别姬 已经开服 2021-07-05 11:00 微信639区无名英雄 已经开服 2021-07-02 11:00 微信638区予智予雄 已经开服 2021-06-29 11:00 微信637区一身正气 已经开服 2021-06-26 11:00 微信636区巾帼英雄 已…

使用PCA可视化数据

作者|Conor OSullivan 编译|VK 来源|Towards Data Science 主成分分析&#xff08;PCA&#xff09;是一个很好的工具&#xff0c;可以用来降低特征空间的维数。PCA的显著优点是它能产生不相关的特征&#xff0c;并能提高模型的性能。 它可以帮助你深入了解数据的分类能力。在…

四、Docker仓库(一)

一、仓库说明 仓库&#xff08;Repository&#xff09;是集中存放镜像的地方。相对镜像和容器来说&#xff0c;对仓库的操作来说相对较少。 官方的镜像仓库地址为&#xff1a;https://hub.docker.com/&#xff0c;缺点&#xff0c;位于国外&#xff0c;有时候不能访问&#xf…

【JZ2440笔记】系统时钟设置

目录 一、前言 二、实验目标 三、S3C2440的时钟体系 四、代码编写 五、实验总结 一、前言 JZ2440开发板上的外部晶振是12MHz的&#xff0c;开发板一上电时S3C2440的系统时钟为12MHz&#xff0c;但是S3C2440最高系统时钟可以跑到400MHz&#xff0c;为了发挥CPU更高的性能&…

[微信] 客服接口调用的时候返回 40003 Invalid OpenID

首先确认收件人在24小时内主动向公众号发过消息。该消息的 FromUserId 即是客服消息的 touser 参数的 OpenId 2017-05-19 更新&#xff1a;可以使用UTF-8了 string url $"https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token{token}"; using (var…