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