Hướng dẫn installing php jwt - cài đặt php jwt

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à

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
7

Trong bài viết ngày hôm nay, mình sẽ không giới thiệu về

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
7 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
    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
7 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

     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
0 trong file
     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
1 :

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

rồi chạy lệnh

     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
2 hoặc bạn chỉ cần chạy lệnh
     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
3 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

     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
4 trong file config
     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
5 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

     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
6 bạn cũng có thể thêm các facade của thằng
     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
7 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

     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
7, 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

     Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
7 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 -

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

Đươ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

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
1 thêm 1 key
    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
2 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
    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
1 là an toàn và bảo mật nhất).

Token time to live -

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

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 :

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
0

Refresh time to live-

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

Đâ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

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
5 ... Tạo ra token mới từ token cũ trong 1 thời gian xác định ...

Default :

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
1

Refresh time to live-

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
5 -
    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
7

Đâ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

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
5 ... Tạo ra token mới từ token cũ trong 1 thời gian xác định ...

Default :

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
2

Refresh time to live-

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

Đâ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

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
5 ... Tạo ra token mới từ token cũ trong 1 thời gian xác định ... -
    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
8 Đường dẫn trỏ đến model mà bạn sử dụng để xác thực

Default :

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
3

Refresh time to live-

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

Đâ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

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
5 ... Tạo ra token mới từ token cũ trong 1 thời gian xác định ... -
    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
9

Hashing algorithm -

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

Default :

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
4

Refresh time to live-

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
5 -
    'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory::class,
4 Đâ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à
    'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory::class,
5 sẽ được đẩy ra

Default :

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
5

Refresh time to live-

    'JWTAuth' => 'Tymon\JWTAuth\Facades\JWTAuth'
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory'
5 -
    'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory::class,
6 Mặc đinh của config này chính là
    'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory::class,
7, 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à
    'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
    'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory::class,
8 .

Default :

    'Tymon\JWTAuth\Providers\JWTAuthServiceProvider',
6

Providers -

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

Đâ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