Hướng dẫn jwt trong php

Lời mở đầu

Mô hình client server -- WEB API hẳn không còn lạ lùng gì với chúng ta nữa , hiện nay việc sự dụng API giờ trở nên phổ biến và rất cần thiết đối với sự phát triển của các website qui mô và uy tín . Tuy nhiên, một vấn đề đặt ra đó là việc xác thực khi sử dụng các API vì khi sử dụng API chúng ta cần sử dụng rất nhiều API để lấy các nguồn thông tin cần thiết và vấn đề ở đây là không phải ai cũng có quyền sử dụng tất cả các nguồn thông tin ... Và giải pháp ở đây chính là jwt token

Trong bài viết ngày hôm nay, mình sẽ không giới thiệu về jwt token nữa, nếu cần tìm hiểu thêm các bạn có thể vào đây để biết thêm chi tiết ... Bài viết này mình sẽ nói rõ ràng về cách setup cũng như sử dụng jwt token trong laravel .

Nào, giờ thì LET GO =)

I : Cài đặt

Để cài đặt được package này điêu kiện tiên quyết là chúng ta phải có server chạy được :

  • PHP 5.4 +
  • Laravel 4 +

Đầu tiên, bạn cần load source thông qua composer bằng cách sửa mục require trong file composer.json :

"require": {
    "tymon/jwt-auth": "0.5.*"
}

rồi chạy lệnh composer update hoặc bạn chỉ cần chạy lệnh composer require tymon/jwt-auth là có thể kéo source về app của mình.

Sau khi source đã kéo về hoàn tất, bạn cần thêm service provider vào mảng provider trong file config app.php theo mẫu sau :

Laravel 4

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',

Laravel 5+

     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,

Sau đó, cũng tại file đó, bạn tìm đến mảng aliases bạn cũng có thể thêm các facade của thằng jwt vào đây :

Laravel 4 :

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'

Laravel 5+ :

    'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory::class,

Cuối cùng bạn cần phải publish config của jwt, bằng cách chạy lệnh sau đậy :

Larave 4:

$ php artisan config:publish tymon/jwt-auth

Laravel 5 +:

$ php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"

Và cuối cùng, đương nhiên bạn không thể quên setup secret key cho thằng jwt này rồi ... Và nếu bạn không có key nào để setuo thì có thể tạo 1 key ngâu nghiên với lệnh sau :

$ php artisan jwt:generate

NOTE :

Nếu bạn sử dụng jwt để thực hiện xác thực cho việc trao đổi thông tin giữa 2 server thì 2 key của 2 server phải giống nhau thì mới có thể giải mã được ... Vì vậy, bạn có thể tạo 1 key bất kỳ bên server này và dùng cho cả server bên kia nữa nhé

Ok, việc setup có vẻ ổn rồi đấy .

II : Sửa thông tin trong file config

Secret Key - secret

Đương nhiên đây là 1 key giúp bạn mã hóa chuỗi token của app ... Sau khi setup như các bước bên trên nó sẽ có dạng :

'secret' => env('JWT_SECRET', 'sjjZlW4VXCtqgcOYxAXtaxu2QJLCzwQR'),

Như mình đã nói ở trên, bạn có thể tự add key khác vào nếu có hoặc nếu không thì bạn có thể vào file .env thêm 1 key JWT_SECRET và setup key vào đấy (mình chọn cách này vì nếu quản lý file bằng git thì ta ko thể công khai key này lên githup được, vì vậy tất cả đều cho vào file .env là an toàn và bảo mật nhất).

Token time to live - ttl

Như cái tên của nó, đây là thời gian mà token của bạn có hiệu lực (tính bằng phút), khi bạn tạo ra 1 token thì chỉ có hiệu lực trong 1 thời gian nhất định tính từ thời điểm tạo token (Khuyến khích của nhà phát triển là thời gian này càng ngắn càng tốt) :

Default :

'ttl' => 60,

Refresh time to live- refresh_ttl

Đây là thời gian (tính bằng phút) bạn có thể tạo mới một token khác từ token cũ mà ko cần xác thực lại... Nói thì có vẻ hơi trừu tượng, bạn có thể hiểu như sau : Khi bạn xác thực và tạo ra 1 token có thời gian có hiệu lực của nó là 60 phút ... Nếu bạn chỉ sử dụng dưới 60 phút thì chả có vấn đề gì cả .Tuy nhiên, nếu bạn sử dụng liên tục trong 90p thì đến phút thứ 60 token của bạn sẽ hết hạn và đánh bật bạn và yêu cầu đăng nhập lại , điều này nghe có vẻ không thân thiện cho người dùng nên nó sinh ra khái niệm refresh_ttl ... Tạo ra token mới từ token cũ trong 1 thời gian xác định ...

Default :

'refresh_ttl' => 20160, //2 week

Hashing algorithm - algo

Như cái tên của nó, đây là thuật toán để tạo ra token

Default :

'algo' => 'HS256',

Nếu các bạn muốn sử dụng các thuật toán khác được support trong package này thì có thể vào đây để xem chi tiết

User model path - user Đường dẫn trỏ đến model mà bạn sử dụng để xác thực

Default :

'user' => 'App\User',

Đương nhiên bạn cũng có thể không sử dụng user để xác thực mà sử dụng customer chảng hạn, tùy vào app của bạn thôi.

User identifier - identifier

Hiểu nôm na rằng thì đây là trường để định danh xác thực, nó là trưởng trong model mà mỗi 1 user phải có riếng biệt ko ai giống ai (thường thì nó là id của bảng đó), cái giá trị của mỗi identifier sẽ được add vào thành phần sub của payload gửi ra (Muốn biết sub là gì thì đọc kỹ hơn ở đây nhé)

Default :

'identifier' => 'id',

Required claims - required_claims Đây là các claims bắt buộc phải có (do bạn định nghĩa) trong token payload bạn định nghĩa, nếu ko thì 1 Exception là TokenInvalidException sẽ được đẩy ra

Default :

'required_claims' => ['iss', 'iat', 'exp', 'nbf', 'sub', 'jti'],

Blacklist enabled - blacklist_enabled Mặc đinh của config này chính là true, nó giúp bạn vô hiệu hoá các token cũ (vẫn còn thời hạn hiệu lực) khi mà bạn sử dụng token đó để tạo ra 1 token mới ... Hiển nhiên điều này là cần thiết vì 1 user mà sử dụng nhiều token cùng 1 lúc khá là nguy hiểm, tuy nhiên nếu bạn cảm thấy không cần thiết thì vẫn có thể set là false .

Default :

'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true),

Providers -providers

Đây là một mảng bao gồm cacis provider mà package sử dụng để lấy dữ liệu hoặc xử lý các tác vụ ... Tất nhiên, bạn cũng thể tự định nghĩa các provice khác vào đây miễn là tương thích vs các cúc năng (Vụ này cần vào vọc code cho kỹ rồi hãy custom nhé)

OK, đến đây thôi nhé ! Trong bai viết sau mình sẽ nói các bạn cụ thể hơn về cách tạo token, refress token , các event của token và đưa ra 1 ví dụ cụ thể hơn về ứng dụng token này.

TÀI LIỆU THAM KHẢO

  • Tìm hiểu về json web token
  • Jwt-auth