laravel5.3 源码分析 Passport
laravel5.3,密码模式的授权认证过程。我会通过两部分内容分享以及查看passport的认证流程分享出来
第一部分:根据官方文档,通过Composer安装Passport
文档地址:http://laravelacademy.org/post/5993.html
第二部分 认证流程
认证流程,我主要从两方面入手
首先是添加这个Passport包,在config/app.php中的providers数组中添加的Laravel\Passport\PassportServiceProvider::class服务,具体注册了哪些服务
然后根据认证路由,从请求路由开始,到最终实现,跟进代码阅读路程
1. Passport服务提供者:
使用这个Passport服务之前,首先需要了解服务提供者的作用,按照文档的介绍,服务提供者是整个应用的启动中心,主要是通过register方法注册一些实例到容器中,在config/app.php的providers数组中,添加

此服务需要注册的事物,

分别先看下这些方法都注册了哪些内容

在这个实现中,跟进tap的方法是将第一个参数作为第二个回调函数的参数的参数,最后返回该回调函数的值

tap函数的第一个参数是$this->makeAuthorizationServer()调用的返回值

这个$this->app就是容器的实例,make方法就是通过传进来的接口类,得到此接口的实现类的对象。在AuthorizationServer类的构造函数中,赋值给类中的成员变量

回到tap方法,将得到的这个认证服务实例传到这个回调函数中

调用AuthorizationServer类中的enableGrantType方法,这个方法中我的理解就是启动各个oauth授权方式,实例化各个授权方式的类,传到这个方法中,将在实例化AuthorizationServer类的时候,赋值的那些成员变量的值,再赋值给这里的每项授权方式对象中,如图

最后在将各个授权方式的对象,保存在enabledGrantTypes数组中,其中key就是每个对象内部的getIdentifier()方法返回的字符串。
到此,就是Passport服务提供者,注册的第一部分内容了,即认证服务相关内容
2. 查看路由的执行过程

这个时候就用到了在安装Passport配置的路由项了

那么就看下这个routes()静态方法是如何实现的

这段代码,实际上就是执行了RouteRegisterar类中的all()方法

我用到的密码模式的路由在这个forAccessTokens()方法中

现在找到了路由,接下来就可以到相应的控制器中看,具体如何实现认证过程
3. 认证过程
在这个Passport包中找到认证的控制器

在这个控制器中,可以看到通过用户账号认证客户端的方法


在这个方法中循环enabledGrantTypes数组,这个数组是在注册认证服务的时候,填的内容,存的所有认证授权方式的类的对象,先判断请求中的grant_type字段是否存在,不存在返回下面错误

存在的话,执行相应类的respondToAccessTokenRequest方法,这里是密码授权方式,所以这个$grantType应该是到PasswordGrant类的实例。

到此类中的respondToAccessTokenRequest方法

在这个方法中,以此校验请求参数,认证请求域,验证用户账号和密码
在此处校验用户的账号和密码的时候,除了校验参数是否存在,还会检验该用户凭证是否存在,最后返回这个类的对象

那么在校验用户凭证的时候,都具体做了些什么呢


在这个方法中:
1. 获取auth.providers.users.model配置,在config/auth.php中

注意一点:修改了默认的User模型路径,相应要改动这个配置
2. 判断是否存在 findForPassport()方法,如果存在,则调用这个方法来判断存在此用户,所以如果需要在实现此认证的时候用自定义的方法,比如表字段不是email的话,需要定义此方法来实现

3. 校验用户的账号密码是否正确

认证成功的话,返回到respondToAccessTokenRequest()方法中,如下方法

继续跟进issueAccessToken方法中实现的内容

得到一个$accessToken变量,是AccessToken.php类的一个对象

然后给该对象中的成员变量赋值,最后调用$this->accessTokenRepository->persisNewAccessToken方法

issueRefreshToken()生成refresh_token类似方法保存到oauth_refresh_tokens表中
最后将得到的access_token和refresh_token,赋值到$responseType保存的对象中,$responseType是在被调用的上一层中new BearerTokenResponse()得来的

返回$responseType对象
最后又回到了respondToAccessTokenRequest()方法中

调用BearerTokenResponse()类的generateHttpResponse方法,返回认证成功的数据.
laravel5.3 源码分析 Passport的更多相关文章
- laravel5.8 源码分析(1) Route
https://learnku.com/docs/laravel/5.8 源码路径 vendor\laravel\framework\src\Illuminate\Routing\Router.php ...
- laravel中间件源码分析
laravel中间件源码分析 在laravel5.2中,HTTP 中间件为过滤访问你的应用的 HTTP 请求提供了一个方便的机制.在处理逻辑之前,会通过中间件,且只有通过了中间件才会继续执行逻辑代码. ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
- java使用websocket,并且获取HttpSession,源码分析
转载请在页首注明作者与出处 http://www.cnblogs.com/zhuxiaojie/p/6238826.html 一:本文使用范围 此文不仅仅局限于spring boot,普通的sprin ...
随机推荐
- 『科学计算』通过代码理解SoftMax多分类
SoftMax实际上是Logistic的推广,当分类数为2的时候会退化为Logistic分类 其计算公式和损失函数如下, 梯度如下, 1{条件} 表示True为1,False为0,在下图中亦即对于每个 ...
- C/C++中的实参和形参,重点以及盲点,自己以前未知的
C/C++中的实参和形参 今天突然看到一道关于形参和实参的题,我居然不求甚解.藐视过去在我的脑海里只有一个参数的概念,对于形参和实参的区别还真的不知道,作为学习了几年C++的人来说,真的深深感觉对 ...
- secureCRT启动xmanager图形化工具
secureCRT启动xmanager图形化工具 2014年9月17日 11:42 secureCRT是我们在维护UNIX或者linux的重要工具.xmanager 工具是连接UNIX或者linux的 ...
- 3.3 建立松耦合组件(MVC 模式最重要的特性之一是它支持、关注“分离”)《精通 ASP.NET MVC 5》 推荐指数:8 星半
笔者通常希望应用程序中的组件尽可能独立,而只有很少几个可控的依赖项.—— 在理想情况下,每个组件都不了解其他组件,而只是通过抽象接口来处理应用程序的其他区域.这称为松耦合 .—— 它能够使应用程序更易 ...
- 变形CSS3
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- 算法笔记——C/C++语言基础篇(已完结)
开始系统学习算法,希望自己能够坚持下去,期间会把常用到的算法写进此博客,便于以后复习,同时希望能够给初学者提供一定的帮助,手敲难免存在错误,欢迎评论指正,共同学习.博客也可能会引用别人写的代码,如有引 ...
- C# 格式化表
C#格式化数值结果表 字符 说明 示例 输出 C 货币 string.Format("{0:C3}", 2) $2.000 D 十进制 string.Format("{0 ...
- [.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序
[.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序 一.练习项目: http://www.asp.net/mvc/tutorials/mvc-4/gettin ...
- TClientDataSet的FileName属性
读取cds文件数据. FileName一定要在设计时输入,否则程序运行时,不会自动读取cds文件. 因为FORM创建时,数据集组件也相应创建,如果是在运行时 设置FileName,那么是在数据集组件创 ...
- python执行系统命令后获取返回值
import os, subprocess # os.system('dir') #执行系统命令,没有获取返回值,windows下中文乱码 # result = os.popen('dir') #执行 ...