19/09/2018, 09:47

Bài 2: Cài đặt Laravel 5.6 và laravel passport.

Thông qua bài trước chúng ta đã hiểu 1 số khái niệm, tiếp tục series chúng ta bắt tay làm việc thôi. 1. Cài đặt laravel và nuxt.js Khởi tạo thư mục làm việc. composer create-project --prefer-dist laravel/laravel laravel-nuxtjs-more-easy-to-learn "5.6.*" các bạn nên cài xampp tùy biến ...

Thông qua bài trước chúng ta đã hiểu 1 số khái niệm, tiếp tục series chúng ta bắt tay làm việc thôi.

1. Cài đặt laravel và nuxt.js

Khởi tạo thư mục làm việc. composer create-project --prefer-dist laravel/laravel laravel-nuxtjs-more-easy-to-learn "5.6.*"

các bạn nên cài xampp tùy biến tên miền ảo nhé đây là kiến thức cơ bản rồi nên mình không giải thích thêm

Thông qua bài 1, các bạn cần cài vue/cli để cài đặt nuxt.js. Tại thư mục đâu đó gì cũng được, còn mình thì để luôn nuxt-client trong laravel-nuxtjs-more-easy-to-learn cho tiện luôn

Đây là cấu trúc thư mục chính của chúng ta chúng ta vào nuxt-client để cài đặt dependencies

cd nuxt-client

npm install

sau đó

npm run dev

để chạy ứng dụng client http://localhost:3000

Chúng ta cần config .env như database, username, password của mysql. Bước này thì dễ rồi nên mình bỏ qua nhanh và tạo bảng mặc định có sẵn

2. Laravel Passport

Cài đặt laravel passport

composer require laravel/passport

Tạo bảng thông qua migrate

php artisan migrate

Để hiểu rõ hơn về laravel passport là gì? Trên diễn đàn của chúng ta rất nhiều bài cụ thể về nó, theo mình các bạn nên hiểu các cơ chế hoạt động trước, mình xin phép giải thích ngắn gọn thôi

Để tạo personal access và password grant chúng ta sẽ cài đặt bằng

php artisan passport:install

tại AppUser

<?php

namespace App;

use LaravelPassportHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;
}

Tiếp theo chúng ta sẽ cài đặt để đăng kí cần thiết access token tại AuthServiceProvider

<?php

namespace AppProviders;

use LaravelPassportPassport;
use IlluminateSupportFacadesGate;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'AppModel' => 'AppPoliciesModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
    }
}

tại config/auth.php để có thể dùng được driver passport và api

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

3.Fake database và viết 1 số method để call API

Chúng ta sử dụng faker để tạo thêm user đăng nhập. tại database/seeds/UsersTablesSeeder.php

<?php

use IlluminateDatabaseSeeder;
use AppUser;

class UsersTablesSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        return factory(User::class, 50)->create();
    }
}

chúng ta sẽ fake 50 người dùng tất cả đều có password mặc định là secret

chúng ta sẽ tạo Controller bằng dòng lệnh php artisan make:controller Auth/AuthController chả biết mình nhớ đúng chưa, nếu sai thì các bạn đổi lại AuthAuthController nhé

chúng ta sẽ xây dựng sẵn các method xử lý

<?php

namespace AppHttpControllersAuth;

use IlluminateHttpRequest;
use AppUser;
use AppHttpControllersController;
use GuzzleHttpClient;
use IlluminateSupportFacadesHash;

class AuthController extends Controller
{
    public function register(Request $request)
    {
        $request->validate([
            'email' => 'required',
            'name' => 'required',
            'password' => 'required'
        ]);

        $user = User::firstOrNew(['email'=>$request->email]);
        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = bcrypt($request->password);
        $user->save();

        $guzzle = new Client;
        //create token for user
        $response = $guzzle->post(url('oauth/token'), [
            'form_params' => [
                'grant_type' => 'password', //sử dụng cơ chế password grant
                'client_id' => '2', 
                'client_secret' => 'ElLyLtBPxqTRAb9nMWiUc0JOMvLT2oihFhpLoBKp', // về secret có thể sẽ khác nhau các bạn thay đổi cho phù hợp
                'username' => $request->email,
                'password' => $request->password,
                'scope' => ',
            ],
        ]);

        return response(['data' => json_decode((string) $response->getBody(), true), 'email' => $user->email, 'userName' => $user->name]);
    }

    public function login(Request $request)
    {
        $request->validate([
            'email' => 'required',
            'password' => 'required'
        ]);

        $user = User::where('email', $request->email)->first();
        if (!$user) {
            return response(['status' => 'error', 'message' => 'User not found']);
        } elseif (Hash::check($request->password, $user->password)) {
            $guzzle = new Client;

            $response = $guzzle->post(url('oauth/token'), [
                'form_params' => [
                    'grant_type' => 'password',
                    'client_id' => '2',
                    'client_secret' => 'ElLyLtBPxqTRAb9nMWiUc0JOMvLT2oihFhpLoBKp',
                    'username' => $request->email,
                    'password' => $request->password,
                    'scope' => ',
                ],
            ]);

            return response(['data' => json_decode((string) $response->getBody(), true), 'email' => $user->email, 'userName' => $user->name]);
        }
    }
}

tại routes/api.php các bạn thêm cho mình 1 số routes để call API tương ứng các method ở trên

Route::post('/register', 'AuthAuthController@register');
Route::post('/login', 'AuthAuthController@login');

Để test được hàm có chạy được không chúng ta sẽ sử dụng POSTMAN alt

với phương thức POST chúng ta login bằng user soi bên trong database. Kết quả trả về như trên hình về access_token chính là thứ xác minh người dùng đã đăng nhập.

Bài hôm nay mình viết đã kết thúc hẹn các bạn bài 3 là lúc chúng ta thiết lập giao diện của client dựa trên nuxt.js

0