zoukankan      html  css  js  c++  java
  • laravel5.3 源码分析 Passport

    laravel5.3,密码模式的授权认证过程。我会通过两部分内容分享以及查看passport的认证流程分享出来

    第一部分:根据官方文档,通过Composer安装Passport

    文档地址:http://laravelacademy.org/post/5993.html

    第二部分 认证流程

    认证流程,我主要从两方面入手

           首先是添加这个Passport包,在config/app.php中的providers数组中添加的LaravelPassportPassportServiceProvider::class服务,具体注册了哪些服务

           然后根据认证路由,从请求路由开始,到最终实现,跟进代码阅读路程

    1. Passport服务提供者:

    使用这个Passport服务之前,首先需要了解服务提供者的作用,按照文档的介绍,服务提供者是整个应用的启动中心,主要是通过register方法注册一些实例到容器中,在config/app.php的providers数组中,添加

     
    在这个PassportServiceProvider类中,注册需要用的实例到容器中

    此服务需要注册的事物,

     
    分别注册认证服务,资源服务,令牌

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

     
    定义一个AuthorizationServer::class的实现

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

     
     

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

     
    返回一个认证服务类的实例

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

     
     

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

     
    这个$server就是第一个参数返回的认证服务AuthorizationServer类的对象

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

     
    $grantType就是相应的授权方式的类

    最后在将各个授权方式的对象,保存在enabledGrantTypes数组中,其中key就是每个对象内部的getIdentifier()方法返回的字符串。

    到此,就是Passport服务提供者,注册的第一部分内容了,即认证服务相关内容

    2. 查看路由的执行过程

     
     

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

     
    在文档中可以找到此配置项

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

     
     

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

     
    跟进各个方法,发现都是一些路由

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

     
     

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

    3. 认证过程

    在这个Passport包中找到认证的控制器

     
     

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

     
    这里的$this->server就是服务提供者中注册的AuthorizationServer类的对象了
     
    在这个方法中首先校验了请求令牌是否存在

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

     
    grant_type错误的请求

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

     
    密码认证的授权类

    到此类中的respondToAccessTokenRequest方法

     
     

    在这个方法中,以此校验请求参数,认证请求域,验证用户账号和密码

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

     
     

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

     
     
     
     

    在这个方法中:

    1. 获取auth.providers.users.model配置,在config/auth.php中

     
    获取User模型

    注意一点:修改了默认的User模型路径,相应要改动这个配置

    2. 判断是否存在 findForPassport()方法,如果存在,则调用这个方法来判断存在此用户,所以如果需要在实现此认证的时候用自定义的方法,比如表字段不是email的话,需要定义此方法来实现

     
     

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

     
    如果想用自定义的方法来校验,同样需要定义validateForPassportPasswordGrant来实现

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

     
    生成access_token和refresh_token

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

     
     

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

     
     

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

     
    在这个方法中,将赋值刚刚赋值的那些值保存到oauth_access_tokens中

    issueRefreshToken()生成refresh_token类似方法保存到oauth_refresh_tokens表中

    最后将得到的access_token和refresh_token,赋值到$responseType保存的对象中,$responseType是在被调用的上一层中new BearerTokenResponse()得来的

     
     

    返回$responseType对象

    最后又回到了respondToAccessTokenRequest()方法中

     
     

    调用BearerTokenResponse()类的generateHttpResponse方法,返回认证成功的数据.

  • 相关阅读:
    ES6 Symbol数据类型和set-map 数据结构
    ES6的字符串和数值的扩展
    获取当前的网络状态
    节流阀
    stellar.js 视差滚动
    h5新增标签及css3新增属性
    vue中使用mui滑动条无法正常滑动
    用css3画有边框的三角形
    多个选项选中某一个的效果(用到siblings()方法)
    消除移动端按钮或者输入框等点击时出现边框
  • 原文地址:https://www.cnblogs.com/wntd/p/8962672.html
Copyright © 2011-2022 走看看