摘要:我們需要在的里面定義一個客戶端的中間件然后在路由里面或者作用域名稱這樣就可以實現不登錄直接調用了參考文檔
利用Laravel 搭建oauth2 API接口 要求
laravel 5.4以上
安裝$ composer require laravel/passport
在配置文件 config/app.php 的providers 數組中注冊 Passport 服務提供者:
LaravelPassportPassportServiceProvider::class,
遷移數據庫 執行完后會生成oauth需要的表
$ php artisan migrate
這一步注意,執行的時候可能會報錯
Syntax error or access violation: 1071 Specified key was too long; max key length is 767 byte
這是由于 Laravel5.4默認使用utf8mb4 編碼
utf8 最大長度字符是3字節 utf8mb4是4字節
解決方法就是
數據庫改用utf8mb4
AppServiceProvider.php里面加上Schema::defaultStringLength(191);
另外Mysql 5.5.3之后才支持utf8mb4也需要注意下
接下來執行
$ php artisan passport:install
會生成兩個客戶端密鑰
Client ID: 1 Client Secret: AwDMcCs65rXkzF80wPaINx5fkoXEfa8lcuuPEvQK Password grant client created successfully. Client ID: 2 Client Secret: KLlLijWk3hX2Ntfzo2iFPgwT4GyITpBjEuDozp5H配置這里可以配置的只有access token的生命周期默認是永久的
在AuthServiceProvider中配置use CarbonCarbon; use LaravelPassportPassport; /** * 注冊所有認證/授權服務. * * @return void */ public function boot() { $this->registerPolicies(); Passport::routes(); Passport::tokensExpireIn(Carbon::now()->addDays(15)); Passport::refreshTokensExpireIn(Carbon::now()->addDays(30)); }修改auth.php
發放access_token
"guards"["driver"] => "passport"頒發
應用場景 我的用戶,在別的網站想用我的賬號直接登錄,參考微信登錄。那么第三方網站就要對接過來,用戶選擇第三方登錄,跳轉到我的頁面,詢問用戶是否允許,用戶允許以后我會帶一個code回去,第三方網站用這個code請求access_token
流程是
請求令牌
"client_id" => "client-id", "redirect_uri" => "http://example.com/callback", "response_type" => "code", "scope" => "",用戶允許以后拿到code換token
$response = $http->post("http://your-app.com/oauth/token", [ "form_params" => [ "grant_type" => "authorization_code", "client_id" => "client-id", "client_secret" => "client-secret", "redirect_uri" => "http://example.com/callback", "code" => $request->code, ], ]);token如果過期了,可以刷新
$response = $http->post("http://your-app.com/oauth/token", [ "form_params" => [ "grant_type" => "refresh_token", "refresh_token" => "the-refresh-token", "client_id" => "client-id", "client_secret" => "client-secret", "scope" => "", ], ]);賬號密碼
這個主要是用于APP(我自己的),用戶通過app輸入賬號和密碼,我用賬號密碼校驗正確了就發送access_token
$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" => "", ], ]);隱式
這種跟第一種差不多,就是省去了code 直接發放,主要用于
JavaScript 或移動應用中客戶端登錄認證信息不能保存時
客戶端證書
這種主要用于機器之間的通信
直接用appid 和 appsecret 換令牌$response = $guzzle->post("http://your-app.com/oauth/token", [ "form_params" => [ "grant_type" => "client_credentials", "client_id" => "client-id", "client_secret" => "client-secret", "scope" => "your-scope", ], ]);私人訪問令牌
這個用于在程序里面調用API的時候
比如$user = AppUser::find(1); // 創建一個不帶域的令牌... $token = $user->createToken("Token Name")->accessToken; // 創建一個帶域的令牌... $token = $user->createToken("My Token", ["place-orders"])->accessToken;在調用api之前需要創建client
創建命令是
$ php artisan passport:client密碼和私人的不同其他都一樣
$ php artisan passport:client --password
$ php artisan passport:client --personal創建好后獲得client-id和client-secret
創建路由5.4以后目錄結構發生變化,路由統一寫在routes文件夾下。
API的路由都寫在api.php確定好路由就可以請求接口了
GET 方式 /api/user "headers" => [ "Accept" => "application/json", "Authorization" => "Bearer ".$accessToken, ],寫到這里遇到一個問題
就是無論怎樣請求 獲取到的token 用來訪問接口的時候 總是返回
UnauthenticatedGOOGLE了下發現好多人也遇到這個問題,據說是token過期時間的問題
在AuthServiceProvider boot里面加上
Passport::tokensExpireIn(Carbon::now()->addDays(15)); Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));這樣應該會解決,然而并沒有,這里等以后一時間再研究下(已解決 見下文)
這個問題有了一定進展
目前通過用戶授權頒發令牌的方式通過了
前提是用戶必須登錄,之前返回Unauthenticated 應該是因為用戶未登錄
在應用站跳轉到授權站的時候,此時用戶需登錄狀態,授權以后拿到code再來換access_token 這個方式OK的,可以正常獲取登錄用戶的信息
賬號密碼獲取令牌的方式也一樣可以通過
站點之前通過 id 和 secret的方式換token,然后拿token請求接口這種方式目前還不行
坑爹啊,官方文檔沒寫全
通過 client_credentials 方式獲取token,請求接口的時候,路由不能用auth或者scope等中間件去驗證,因為他們會首先驗證有沒有登錄。
我們需要在appHttpKernel.php 的 $routeMiddleware 里面定義一個客戶端API的中間件
"client_credentials" => LaravelPassportHttpMiddlewareCheckClientCredentials::class,
然后在路由里面
Route::middleware("client_credentials")或者
Route::middleware("client_credentials:作用域名稱")
這樣就可以實現不登錄直接調用api了
參考文檔
https://laravel.com/docs/5.4/...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/22544.html
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區優秀文章 Laravel 5.5+passport 放棄 dingo 開發 API 實戰,讓 API 開發更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:模糊授權,跟上面的認證碼授權類似,不同的是,我們的資源服務器,返回的直接就是準入令牌,而不是認證碼。 本文來自pilishen.com----原文鏈接; 歡迎來和pilishen一起學習php&Laravel;學習群:109256050 OAuth2是一個安全框架,控制著程序受保護部分的準入,主要是控制不同的客戶端如何來調取API,保證它們在請求相應資源的時候有相應的權限。 Larav...
摘要:在開發中,用戶認證是核心,是數據是否有保障的前提,目前主要有兩種常用方式進行用戶認證和。附是為了在網絡應用環境間傳遞聲明而執行的一種基于的開放標準。 好久沒寫 PHP 代碼了,尤其是 Lumen,我是 Lumen 的忠實用戶,自從面世開始,我就將 Lumen 作為我 API 的主要框架使用。 但說到 API,不得不說的一個概念:「前后端分離」,現在越來越多的團隊都采用前后端分離,徹底解...
摘要:前期準備原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。框架,是我最喜歡的框架了,沒有之一。 前期準備 原文地址前言,為什么做以及要做個啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。這不,最近又開始折騰APP了,話說現在開...
閱讀 1006·2023-04-25 14:45
閱讀 2781·2021-09-30 09:59
閱讀 3125·2021-09-22 15:48
閱讀 2428·2019-08-30 15:55
閱讀 3477·2019-08-30 15:44
閱讀 548·2019-08-29 14:07
閱讀 3416·2019-08-26 13:45
閱讀 541·2019-08-26 11:31