LARAVEL + JWT
[vc_row][vc_column][vc_column_text]什麼是JWT?
簡單來說就是JSON Web Tokens
今天,我登入了,就會收到一組token,然而我再拿著這組token繼續去要資料,當然也包括身分的識別,而且這組token是有時間限制的,當token過期,就必須重新登入。
JWT本身是極為輕巧的規範,有乖乖點進第一行的超連結的同學就會知道它有多輕巧。
今天我們就來使用Laravel來實作,若還不認識Laravel的同學請轉向。
必備環境:Laravel、composer、Apache或其他Web Server、MySQL、PHP、Postman
當然,Wagon都幫我們準備好了,使用其他環境也是可以的,當然也能在現成的環境上增加。
Postman是一款可以用來測試GET、POST、UPDATE、DELETE等Restful API的工具。
進入正題:
1.利用commanad line來new一個專案並安裝JWT
composer create-project laravel/laravel JWTExam "5.2.*" cd JWTExam composer require tymon/jwt-auth
筆者使用版本:Laravel 5.2 tymon/jwt-auth 0.5.9
-
建立資料庫以及修改.env的DB部分
-
common line:
<code class="EnlighterJSRAW" data-enlighter-language="null">artisan migrate
-
config\app.php
'providers' => [ ..., Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class ]
'aliases' => [ ..., 'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class, 'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class ]
-
command line:
<code class="EnlighterJSRAW" data-enlighter-language="null">artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
-
生成JWT KEY
command line: <code class="EnlighterJSRAW" data-enlighter-language="null">artisan jwt:generate
- 我們使用內建的user model與users資料表來試做
建立seed來模擬資料
database\seeds\DatabaseSeeder.php
'test', 'email' => 'test@test.com', 'password' => Hash::make('secret') ] ); } } command line: `artisan db:seed`
(建立完記得檢查是否成功)
8. app\Http\Kernel.php
protected $routeMiddleware = [ ..., 'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class, 'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class ];
9. 建立路由
app\Http\routes.php
Route::group(['prefix' => 'api'], function() { Route::get('auth', 'AuthController@index'); Route::post('auth', 'AuthController@auth'); });
10. 建立controller `artisan make:controller AuthController`
app\Http\Controllers\AuthController.php (路徑不要錯了)
only('email', 'password'); try { if (! $token = JWTAuth::attempt($credentials)) { return response()->json(['error' => 'invalid_credentials'], 401); } } catch (JWTException $e) { return response()->json(['error' => 'could_not_create_token'], 500); } return response()->json(compact('token')); } public function __construct() { $this->middleware('jwt.auth', ['except' => ['auth']]); } public function index() { return response()->json(Auth::user()->all()); } }
11. 開啟Postman進行測試
(建議先在command line: `artisan route:list `看看有沒有錯誤訊息)
![1](https://bgpsekai.thisistap.com/wp-content/uploads/2016/07/1-500x270.png)
這個是沒有經過驗證的結果
我們現在來取得token
![2](https://bgpsekai.thisistap.com/wp-content/uploads/2016/07/2-500x270.png)
這個代表沒有經過Laravel的[csrf](https://laravel.tw/docs/5.2/routing#csrf-protection)認證(這邊就不贅述了)
讓我們把csrf關閉
在app\Http\Kernel.php找到這行,並且註解
` \App\Http\Middleware\VerifyCsrfToken::class,`
![3](https://bgpsekai.thisistap.com/wp-content/uploads/2016/07/3-500x270.png)
出現此錯誤代表email或password錯誤
![4](https://bgpsekai.thisistap.com/wp-content/uploads/2016/07/4-500x270.png)
這樣子就可以得到token了
接下來將這token這樣使用(如網址列)
![5](https://bgpsekai.thisistap.com/wp-content/uploads/2016/07/5-500x270.png)
如此,我們就能取得想要的資料了
※圖中有切換GET與POST
另外,如果有同學想利用ajax來獲得資料的話會遇上cors的錯誤(如圖)
![6](https://bgpsekai.thisistap.com/wp-content/uploads/2016/07/6-500x194.png)
我們將在[這篇文章](https://bgpsekai.thisistap.com/tutorials/laravel/2016/07/laravel-cors/)講解如何解決
心理OS: TMD又要來測試這篇文章的完整性,重run一次…(趴
參考文章:
http://blog.qiji.tech/archives/4091[/vc_column_text][/vc_column][/vc_row]