2016年9月1日 星期四

LARAVEL + JWT

什麼是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
  1. laravel new JWTExam
  2. cd JWTExam
  3. composer require tymon/jwt-auth
筆者使用版本:Laravel 5.2 tymon/jwt-auth 0.5.9
2. 建立資料庫以及修改.env的DB部分
3. common line: artisan migrate
4. config\app.php
  1. 'providers' => [
  2. ...,
  3. Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class
  4. ]
  1. 'aliases' => [
  2. ...,
  3. 'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
  4. 'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class
  5. ]
5. command line: artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
6. 生成JWT KEY
command line: artisan jwt:generate
7. 我們使用內建的user model與users資料表來試做
建立seed來模擬資料
database\seeds\DatabaseSeeder.php
  1. use Illuminate\Database\Seeder;
  2. use App\User;
  3. class DatabaseSeeder extends Seeder
  4. {
  5. /**
  6. * Run the database seeds.
  7. *
  8. * @return void
  9. */
  10. public function run()
  11. {
  12. User::create(
  13. [
  14. 'name' => 'test',
  15. 'email' => 'test@test.com',
  16. 'password' => Hash::make('secret')
  17. ]
  18. );
  19. }
  20. }
command line: artisan db:seed
(建立完記得檢查是否成功)
8. app\Http\Kernel.php
  1. protected $routeMiddleware = [
  2. ...,
  3. 'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
  4. 'jwt.refresh' => \Tymon\JWTAuth\Middleware\RefreshToken::class
  5. ];
9. 建立路由
app\Http\routes.php
  1. Route::group(['prefix' => 'api'], function()
  2. {
  3. Route::get('auth', 'AuthController@index');
  4. Route::post('auth', 'AuthController@auth');
  5. });
10. 建立controller artisan make:controller AuthController
app\Http\Controllers\AuthController.php (路徑不要錯了)
  1. namespace App\Http\Controllers;
  2. use Illuminate\Http\Request;
  3. use App\Http\Requests;
  4. use Auth;
  5. use JWTAuth;
  6. class AuthController extends Controller
  7. {
  8. public function auth(Request $request)
  9. {
  10. $credentials = $request->only('email', 'password');
  11. try {
  12. if (! $token = JWTAuth::attempt($credentials)) {
  13. return response()->json(['error' => 'invalid_credentials'], 401);
  14. }
  15. } catch (JWTException $e) {
  16. return response()->json(['error' => 'could_not_create_token'], 500);
  17. }
  18. return response()->json(compact('token'));
  19. }
  20. public function __construct()
  21. {
  22. $this->middleware('jwt.auth', ['except' => ['auth']]);
  23. }
  24. public function index()
  25. {
  26. return response()->json(Auth::user()->all());
  27. }
  28. }
11. 開啟Postman進行測試
(建議先在command line: artisan route:list 看看有沒有錯誤訊息)
1
這個是沒有經過驗證的結果
我們現在來取得token
2
這個代表沒有經過Laravel的csrf認證(這邊就不贅述了)
讓我們把csrf關閉
在app\Http\Kernel.php找到這行,並且註解
\App\Http\Middleware\VerifyCsrfToken::class,
3
出現此錯誤代表email或password錯誤
4
這樣子就可以得到token了
接下來將這token這樣使用(如網址列)
5
如此,我們就能取得想要的資料了

※圖中有切換GET與POST

另外,如果有同學想利用ajax來獲得資料的話會遇上cors的錯誤(如圖)
6
我們將在這篇文章講解如何解決

心理OS: TMD又要來測試這篇文章的完整性,重run一次…(趴

參考文章:
http://blog.qiji.tech/archives/4091

reference : https://bgpsekai.thisistap.com/tutorials/laravel/2016/07/laravel-jwt/

沒有留言:

wibiya widget