laravel5.3钠绍,密碼模式的授權認證過程媒熊。我會通過兩部分內(nèi)容分享以及查看passport的認證流程分享出來
第一部分:根據(jù)官方文檔宏胯,通過Composer安裝Passport
文檔地址:http://laravelacademy.org/post/5993.html
第二部分 認證流程
認證流程,我主要從兩方面入手
? ? ? ?首先是添加這個Passport包肢专,在config/app.php中的providers數(shù)組中添加的Laravel\Passport\PassportServiceProvider::class服務巾乳,具體注冊了哪些服務
? ? ? ?然后根據(jù)認證路由,從請求路由開始鸟召,到最終實現(xiàn)胆绊,跟進代碼閱讀路程
1. Passport服務提供者:
使用這個Passport服務之前,首先需要了解服務提供者的作用欧募,按照文檔的介紹压状,服務提供者是整個應用的啟動中心,主要是通過register方法注冊一些實例到容器中跟继,在config/app.php的providers數(shù)組中种冬,添加
此服務需要注冊的事物舔糖,
分別先看下這些方法都注冊了哪些內(nèi)容
在這個實現(xiàn)中金吗,跟進tap的方法是將第一個參數(shù)作為第二個回調(diào)函數(shù)的參數(shù)的參數(shù)十兢,最后返回該回調(diào)函數(shù)的值
tap函數(shù)的第一個參數(shù)是$this->makeAuthorizationServer()調(diào)用的返回值
這個$this->app就是容器的實例,make方法就是通過傳進來的接口類摇庙,得到此接口的實現(xiàn)類的對象旱物。在AuthorizationServer類的構(gòu)造函數(shù)中,賦值給類中的成員變量
回到tap方法卫袒,將得到的這個認證服務實例傳到這個回調(diào)函數(shù)中
調(diào)用AuthorizationServer類中的enableGrantType方法,這個方法中我的理解就是啟動各個oauth授權方式宵呛,實例化各個授權方式的類,傳到這個方法中夕凝,將在實例化AuthorizationServer類的時候宝穗,賦值的那些成員變量的值,再賦值給這里的每項授權方式對象中码秉,如圖
最后在將各個授權方式的對象逮矛,保存在enabledGrantTypes數(shù)組中,其中key就是每個對象內(nèi)部的getIdentifier()方法返回的字符串泡徙。
到此橱鹏,就是Passport服務提供者,注冊的第一部分內(nèi)容了堪藐,即認證服務相關內(nèi)容
2. 查看路由的執(zhí)行過程
這個時候就用到了在安裝Passport配置的路由項了
那么就看下這個routes()靜態(tài)方法是如何實現(xiàn)的
這段代碼莉兰,實際上就是執(zhí)行了RouteRegisterar類中的all()方法
我用到的密碼模式的路由在這個forAccessTokens()方法中
現(xiàn)在找到了路由礁竞,接下來就可以到相應的控制器中看糖荒,具體如何實現(xiàn)認證過程
3. 認證過程
在這個Passport包中找到認證的控制器
在這個控制器中,可以看到通過用戶賬號認證客戶端的方法
在這個方法中循環(huán)enabledGrantTypes數(shù)組模捂,這個數(shù)組是在注冊認證服務的時候捶朵,填的內(nèi)容,存的所有認證授權方式的類的對象狂男,先判斷請求中的grant_type字段是否存在综看,不存在返回下面錯誤
存在的話,執(zhí)行相應類的respondToAccessTokenRequest方法岖食,這里是密碼授權方式红碑,所以這個$grantType應該是到PasswordGrant類的實例。
到此類中的respondToAccessTokenRequest方法
在這個方法中泡垃,以此校驗請求參數(shù)析珊,認證請求域,驗證用戶賬號和密碼
在此處校驗用戶的賬號和密碼的時候蔑穴,除了校驗參數(shù)是否存在,還會檢驗該用戶憑證是否存在忠寻,最后返回這個類的對象
那么在校驗用戶憑證的時候,都具體做了些什么呢
在這個方法中:
1. 獲取auth.providers.users.model配置存和,在config/auth.php中
注意一點:修改了默認的User模型路徑奕剃,相應要改動這個配置
2. 判斷是否存在 findForPassport()方法,如果存在捐腿,則調(diào)用這個方法來判斷存在此用戶祭饭,所以如果需要在實現(xiàn)此認證的時候用自定義的方法,比如表字段不是email的話叙量,需要定義此方法來實現(xiàn)
3. 校驗用戶的賬號密碼是否正確
認證成功的話,返回到respondToAccessTokenRequest()方法中绞佩,如下方法
繼續(xù)跟進issueAccessToken方法中實現(xiàn)的內(nèi)容
得到一個$accessToken變量寺鸥,是AccessToken.php類的一個對象
然后給該對象中的成員變量賦值,最后調(diào)用$this->accessTokenRepository->persisNewAccessToken方法
issueRefreshToken()生成refresh_token類似方法保存到oauth_refresh_tokens表中
最后將得到的access_token和refresh_token,賦值到$responseType保存的對象中胆建,$responseType是在被調(diào)用的上一層中new BearerTokenResponse()得來的
返回$responseType對象
最后又回到了respondToAccessTokenRequest()方法中
調(diào)用BearerTokenResponse()類的generateHttpResponse方法,返回認證成功的數(shù)據(jù)