API Authentication Trong Laravel Là Gì?

API Authentication Trong Laravel Là Gì?
Việc xác thực thường khiến các anh em hơi ngán khi phải thực hiện. Tuy nhiên, hệ thống Laravel có API Authentication sẽ hỗ trợ mọi người vượt đèo dễ dàng hơn.

Hệ thống Laravel giúp chúng ta thực hiện việc xác minh qua các mẫu đăng nhập truyền thống. Thao tác này sẽ không còn phức tạp nữa. Nhờ có API Authentication, nó thường được sử dụng mã để nhận dạng người dùng và không có duy trì trạng thái giữa các phiên yêu cầu. Nhờ có Laravel, xác minh API nhanh gọn và “dễ thở” bằng cách dùng Laravel Passport. 

 

Giới thiệu về API Authentication 

 

Authentication là quá trình xác nhận các thông tin đăng nhập của người dùng. Trong các ứng dụng trên web, phần xác thực này được quản lý từ các phiên lấy tham số đầu vào (địa chỉ email, tên người dùng và mật khẩu) nhằm nhận dạng đúng người dùng. Nếu các thông số đó là chính xác, người dùng đã được xác thực đúng. 

 

Authentication trong Laravel là gì?

 

Authentication trong Laravel cũng có tính năng chứng thực tương tự như authentication thông thường. Tuy nhiên, cách thức hoạt động của nó có thể khác một số chỗ. Các bạn mở tập tin auth.php theo đường dẫn config/auth.php. 

Về API Authentication trong Laravel 

 

Laravel cho phép chúng ta thực hiện việc chứng thực qua các form đăng nhập truyền thống. Các thao tác trở nên dễ dàng và nhanh chóng. Các API sử dụng mã xác thực người dùng và không duy trì trạng thái giữa các phiên yêu cầu. 

 

Sử dụng Laravel passport, chuyện xác thực API trở nên nhanh chóng và dễ. Nó cung cấp các thông tin cần thiết để triển khai máy chủ OAuth2 hoàn chỉnh cho ứng dụng của bạn trên Laravel. Thời gian tiến hành chỉ mất vài phút. Passport được xây dựng ở đầu trang của máy chủ League OAuth2 server và OAuth2 League. Chúng được duy trì từ Alex Bilbie. 

 

Cách cài đặt API Authentication vào Laravel 

 

Để bắt đầu cài đặt API Authentication, bạn cần cài passport trước và cài nó qua trình quản lý gói của composer. 

 

composer require laravel/passport

 

Thông thường, nhà cung cấp dịch vụ passport đăng ký thư mục di trú cơ sở dữ liệu riêng với framework. Do đó, bạn nên chuyển cơ sở dữ liệu của bạn đi nơi khác ngay sau khi bạn đã đăng ký nhà cung cấp. Việc thay đổi nơi đặt passport tạo ra các bảng mà ứng dụng của bạn cần phải lưu trữ thông tin của những người dùng và các access tokens kèm theo. 

 

php artisan migrate

 

Nếu không di chuyển mặc định của passport, thì bạn nên sử dụng phương thức này: Passort ::ignoreMigrations theo phương thức register của AppServiceProvider. Bạn cũng có thể thay đổi các di chuyển mặc định bằng cách sử dụng nhà cung cấp thủ công: php artisan vendor:publish --tag=passport-migrations.

 

Bạn thực hiện dòng lệnh passport:install. Đây là lệnh tạo ra các khóa mã hóa cần thiết để tạo các mã thông báo truy cập an toàn. Lệnh này cũng sẽ tạo thành các khách hàng truy cập cá nhân và cấp mật khẩu sẽ được dùng vào việc tạo các mã truy cập.

 

php artisan passport:install

 

Một khi lệnh này đã bắt đầu chạy, bạn có thể bổ sung tính năng Laravel\Passport\HasApiTokens  vào mô hình App\User của bạn. Nó sẽ cung cấp một số phương pháp hỗ trợ cho mô hình của bạn đủ khả năng kiểm tra mã thông báo và phạm vi người dùng đã được xác thực. 

 

 'App\Policies\ModelPolicy',

    ];

    /**

     * Register any authentication / authorization services.

     *

     * @return void

     */

    public function boot()

    {

        $this->registerPolicies();

        Passport::routes();

    }

}

// Bạn nên đặt tùy chọn driver trong tập cấu hình config/auth.php. Driver đó thuộc bộ phận xác thực API vào passport. Điều này giúp ứng dụng của bạn đủ khả năng sử dụng TokenGuard của passport khi xác thực các yêu cầu API đến. 

'guards' => [

    'web' => [

        'driver' => 'session',

        'provider' => 'users',

    ],

    'api' => [

        'driver' => 'passport',

        'provider' => 'users',

    ],

],

 

Frontend Quickstart là gì?

 

Để có thể dùng các thành phần trong Passport Vue components, bạn cần đến framework Vue JavaScript. Các thành phần đó cũng có dùng đến framework Boostrap CSS. Tuy nhiên, các thành phần đó cũng đóng vai trò là nguồn tài liệu tham khảo có giá trị khi bạn không sử dụng các công cụ này thường xuyên.

 

Passport đi kèm với JSON API mà bạn có thể dùng nhằm cho phép người sử dụng tạo các client và token truy cập. Nhưng bạn có thể phải mất nhiều thời gian để giải mã và tìm đường đi vào và tương tác với các API đó. Do đó, passport cũng bao gồm các thành phần Vue đã xây dựng sẵn trước đó. Điều đó giúp bạn dùng và triển khai phiên làm việc hiệu quả. 

 

Để có thể xuất bản các thành phần Passport Vue, bạn nên chọn lệnh nhà cung cấp vendor:publish

 

php artisan vendor:publish --tag=passport-components

 

Lưu ý là các thành phần được xuất bản sẽ nằm trong thư mục resources/assets/js/components. Khi đã xuất bản các thành phần, đừng quên đăng ký chúng trong tập tin resources/assets/js/app.js

 

Vue.component(

    'passport-clients',

    require('./components/passport/Clients.vue')

);

Vue.component(

    'passport-authorized-clients',

    require('./components/passport/AuthorizedClients.vue')

);

Vue.component(

    'passport-personal-access-tokens',

    require('./components/passport/PersonalAccessTokens.vue')

);

 

Một khi bạn đã đăng ký các thành phần đó, bạn cần đảm bảo mọi thứ đã sẵn sàng để chạy NPM run dev và thuật lại các asset. Khi đã thực hiện phần assets, bạn có thể loại bỏ các thành phần trong các mẫu của ứng dụng để tiếp tục tạo clients và access token cá nhân.

 





 

Deploying Passport là gì?

 

Khi thực hiện passport tới các máy chủ sản xuất vào lần đầu tiên, bạn nên thực hiện dòng lệnh passport:keys. Lệnh này tạo các khóa mật mã và yêu cầu sự xuất hiện của passport để tạo mã thông báo truy cập. Các phím được tạo ra không đủ khả năng kiểm soát nguồn. 

 

php artisan passport:keys

 

Token Lifetimes

 

Passport thường mặc định phát hành các mã thông báo truy cập lâu dài và không cần phải tạo mới. Nếu muốn cấu hình vòng đời mã thông báo ngắn hơn, thì bạn có thể dùng các phương thức tokensExpireIn và refreshTokensExpireIn. Các phương pháp đó nên được gọi từ phương thức boot của AuthServiceProvider. 

 

use Carbon\Carbon;

/**

 * Register any authentication / authorization services.

 *

 * @return void

 */

public function boot()

{

    $this->registerPolicies();

    Passport::routes();

    Passport::tokensExpireIn(Carbon::now()->addDays(15));

    Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));

}

 

Issuing access tokens

 

Sử dụng OAuth2 với mã ủy quyền là cách mà các bạn lập trình viên đều quen thuộc. Khi các bạn sử dụng mã ủy quyền, một ứng dụng client application sẽ được chuyển hướng người dùng đến máy chủ của các bạn. Nơi đó, họ sẽ chấp nhận hoặc từ chối yêu cầu phát hành một access token đến client.

 

Quản lý clients

 

Các lập trình viên khi xây dựng các ứng dụng cần tương tác với API ứng dụng của các bạn. Khi đó, các bạn cần đăng ký ứng dụng của họ và của các bạn bằng cách tạo ra một client. 

 

Điều này được tiến hành dựa trên việc cung cấp tên ứng dụng và URL mà ứng dụng của bạn có thể chuyển hướng đến sau khi người dùng chấp nhận yêu cầu ủy quyền. Lệnh sẽ là passport:client. 

 

Để tạo một client đơn giản và nhanh chóng là dùng lệnh passport:client. Lệnh này được sử dụng để tạo các khách hàng của chính bạn để bắt đầu kiểm nghiệm chức năng OAuthe2. Khi chạy lệnh client, passport sẽ tự động nhắc nhở bạn để nắm nhiều thông tin hơn về client và đồng thời cung cấp ID bí mật.

 

php artisan passport:client

 

JSON API là gì?

 

Vì người dùng sẽ không được thực hiện lệnh client, passport sẽ cung cấp một API JSON mà bạn dùng nó để tạo clients. Thao tác này giúp bạn tiết kiệm thời gian kiểm tra mã tạo khi có sự cố nào đó xảy ra đột ngột. Thậm chí bạn có thể kiểm soát quá trình cập nhật và xóa các máy khách thuận lợi hơn. 

 

Tuy nhiên, bạn nên cần lắp nối API JSON của passport với giao diện người dùng riêng bạn. Vì nó sẽ cung cấp bảng điều khiển cho người dùng để quản lý client của họ. Các bạn cũng có thể xem xét toàn bộ các điểm cuối API để quản lý client. Sử dụng Axios để chứng minh việc yêu cầu HTTP đến các điểm cuối. 

 

Nếu không thực hiện tất cả giao diện quản lý client của mình, thì bạn có thể dùng frontend quickstart để có một frontend đầy đủ chức năng trong một thời gian ngắn (đếm từng phút). 

 

GET /oauth/clients

 

Đường dẫn này sẽ trả về toàn bộ client cho người dùng đã được xác minh. Nó hữu ích khi liệt kê tất cả client của người dùng để chỉnh sửa, lọc và xóa các thông tin người dùng. 

 

axios.get('/oauth/clients')

    .then(response => {

        console.log(response.data);

    });

POST /oauth/clients

 

Đường dẫn này để tạo ra các client mới hoàn toàn. Nó sẽ đòi 2 loại dữ liệu – tên của client và một redirect URL. Redirect URL là nơi mà người dùng sẽ được chuyển hướng sau khi phê duyệt hoặc từ chối yêu cầu ủy quyền. 

 

Khi khách hàng đã được tạo mới, nó sẽ có một client ID và client bí mật. Các giá trị đó sẽ được dùng khi yêu cầu access tokens từ ứng dụng của bạn. Client tạo ra đường dẫn route sẽ quay trở lại với client mới, tên của khách hàng và một URL chuyển hướng. URL chuyển hướng ID khách hàng, truy cập các mã số truy cập và bí mật khách hàng cũng được kèm theo. Trình tạo khách hàng sẽ trả về trường hợp có khách hàng mới. 

 

const data = {

    name: 'Client Name',

    redirect: 'http://example.com/callback'

};

axios.post('/oauth/clients', data)

    .then(response => {

        console.log(response.data);

    })

    .catch (response => {

        // List errors on response...

    });

 

Yêu cầu tokens 

 

Chuyển hướng để được ủy quyền 

 

Khi bạn đã tạo các khách hàng mới, các bạn có thể dùng ID khách hàng và thông tin bí mật của họ để yêu cầu mã ủy quyền và có quyền truy cập mã thông báo từ ứng dụng của bạn. Ứng dụng tiêu thụ phải tạo được tối thiểu một yêu cầu chuyển hướng đến đường dẫn / oauth / autoclick của ứng dụng của bạn. 

 

Route::get('/redirect', function () {

    $query = http_build_query([

        'client_id' => 'client-id',

        'redirect_uri' => 'http://example.com/callback',

        'response_type' => 'code',

        'scope' => '',

    ]);

    return redirect('http://your-app.com/oauth/authorize?'.$query);

});

 

Phê duyệt yêu cầu 

 

Khi được yêu cầu, passport sẽ tự hiển thị ra một mẫu cho người dùng. Khi đó, họ có quyền chấp nhận hoặc từ chối với yêu cầu ủy quyền đó. Nếu họ chấp nhận lời yêu cầu đó, nó sẽ chuyển hướng đến redirect_uri (đã được xác định từ ứng dụng tiêu thụ). Redirect_uri phải tương thích với URL chuyển hướng (đã có chỉ định trong quá trình tạo thông tin khách hàng mới). 

 

Trong trường hợp bạn muốn tùy chỉnh màn hình phê duyệt ủy quyền, bạn đề xuất thêm quan điểm của passport bằng cách dùng nhà cung cấp các lệnh Artisan. Các chế độ xem được phiên xuất bản sẽ có mặt trong resources/views/vendor/passport.

 

php artisan vendor:publish --tag=passport-views

 

Cách chuyển đổi mã ủy quyền để truy cập tokens 

 

Nếu người dùng đồng ý với yêu cầu ủy quyền, thì họ sẽ được chuyển tới ứng dụng dành cho người tiêu dùng. Người tiêu dùng sẽ gửi yêu cầu POST cho ứng dụng của bạn để yêu cầu mã thông báo truy cập. Yêu cầu phải có mã ủy quyền do ứng dụng của bạn phát hành khi người dùng đồng ý ủy quyền. Ở ví dụ bên dưới, các bạn sẽ thấy dùng thư viện Guzzle HTTP để thực hiện yêu cầu POST.

 

Route::get('/callback', function (Request $request) {

    $http = new GuzzleHttp\Client;

    $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,

        ],

    ]);

    return json_decode((string) $response->getBody(), true);

});

 

Route này (/oauth/token) sẽ trả về phản hồi JSON chứa các thuộc tính access_token, refresh_token và expires_in. Thuộc tính expires_in chứa các số giây đầy đủ cho tới khi mã thông báo truy cập hết hạn. 

 

Làm mới Tokens

 

Nếu ứng dụng có thể phát hành các thẻ truy cập ngắn, người dùng nên thay các thể thẻ truy cập mới thông qua mã thông báo (được cung cấp cho họ khi mã thông báo truy cập được phát hành). Ở ví dụ bên dưới, các bạn sẽ dùng thư viện Guzzle HTTP để tạo mới mã thông báo.

 

$http = new GuzzleHttp\Client;

$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' => '',

    ],

]);

return json_decode((string) $response->getBody(), true);

 

Route /oauth/token thường sẽ trả về JSON chứa các thuộc tính access_token, refresh_token và expires_in. Trong đó, expires_in sẽ tính số giây cho tới khi nào mà hết hạn token thì ngưng.

 

Hồ Hữu Hiền

Mình là developer nên đôi khi viết bài không hay lắm mong các bạn thông cảm. Nếu muốn biết thêm thông tin về mình thì vui lòng vào website này để biết. https://huuhienqt.dev/

Bình luận (0)