post-image

Google API + Laravel: Setup một project Goravel hoàn hảo!

Tổng quan

Bài viết này sẽ hướng dẫn các bạn tự setup một project Laravel sử dụng Google API một cách tốt nhất có thể (ít ra là tốt với mình). Nếu có gì sai sót hoặc chưa tối ưu, các bạn vui lòng góp ý để mình chỉnh sửa lại tốt hơn 

1. Chuẩn bị

Dĩ nhiên là cần một bộ project Laravel mới kính coong không tạp nham rồi. Ngoài ra bạn nên nâng cấp môi trường phát triển lên bản PHP 7.2 để support Laravel tốt nhất (Bản Laravel 5.6^ đã yêu cầu phải sử dụng PHP 7 rồi mà ).

Một tài khoản Google (có kích hoạt G-suite càng tốt)

  • Laravel 5.6.*
  • Google account
  • PHP 7.0^
  • npm, composer, git
  • Ubuntu (nếu có)

Sau khi chuẩn bị xong những thứ kia thì chúng ta cùng bắt tay vào làm từng bước thôi:

Cài đặt credentials

Đây là bước cấp quyền cho tài khoản Google để được phép truy cập vào các API.

Bạn truy cập đường dẫn sau: https://console.developers.google.com/

Đăng nhập tài khoản Google của bạn.

Sau khi đăng nhập xong bạn sẽ được chuyển hướng vào trang dashboard của mình.

Tạo một project:

Chọn ô Select a project như hình dưới, sau đó chọn một project hoặc tạo mới nếu bạn chưa có

image 10

Sau khi tạo xong, bạn chọn project vừa tạo, chọn Credentials và create credentials như hình dưới:

image 8

Chọn Other, nhập tên và bấm Create

image 9

Sau khi tạo xong bạn tải key này xuống sẽ được một file có tên: client_secret.etc..json Các bạn lưu file này ở một chỗ nào đó dễ tìm, chúng ta sẽ sử dụng nó ngay bây giờ đây.

Cơ bản như vậy là hoàn thành các bước cấu hình tài khoản Google. Tiếp theo sẽ là cấu hình Google Client cho project Laravel.

Cấu hình Google Client cho Laravel

Google đã tạo ra một bộ thư viện để developer tương tác với APIs của họ một cách đơn giản hơn.

Để sử dụng bộ thư viện này bạn chạy lệnh:

composer require google/apiclient:"^2.0"
Code language: JavaScript (javascript)

OK vậy là tương đối ngon rồi. Các bạn tìm lại file client_secret.etc..json đã tải xuống ở bước trước sau đó tạo một thư mục có tên google trong storage. Đây là thư mục sẽ chứa các file xác thực tài khoản Google của bạn. Sau khi tạo xong, bạn copy file client_secret.etc..json vào thư mục này, đổi tên thành credentials.json cho dễ tìm :3

Bạn tạo tiếp một file google-api.php trong config, file này sẽ lấy ra thông số của credentials và cả một thứ gọi là token ở bước sau nữa.

google-api.php

return [ 'client_path' => storage_path('google/credentials.json'), 'token_path' => storage_path('google/token.json'), ];
Code language: PHP (php)

Lấy token

Để có thể sử dụng các API của Google thì chúng ta cần thực hiện một bước quan trọng nữa đó là xác thực người dùng. Mỗi một request đến các endpoints của Google đều cần đến một thứ gọi là token, nó dùng để xác thực tài khoản có được phép sử dụng các API hay không và được sử dụng những API nào.

Các bước lấy token này nếu lấy thủ công sẽ khá là lằng nhằng phức tạp nên mình đã tạo ra một bộ command nhỏ để chúng ta có thể thực hiện dễ dàng hơn.

Đầu tiên các bạn tạo ra một Laravel Command bằng câu lệnh:

php artisan make:command <tên command> ex: php artisan make:command GoogleGetToken
Code language: CSS (css)

Một file sẽ được tạo trong app > Console > Commands tên là GoogleGetToken. Các bạn mở file này lên và bắt đầu code nào.

Nếu ai chưa từng làm việc này lần nào thì nên chú ý đến một số thứ sau:

protected $signature = 'command:name'; //tên command //giống như php artisan make:controller chẳng hạn // của chúng ta sẽ là protected $signature = 'google:get-token'; public function handle() { // nơi viết code xử lý cho command }
Code language: PHP (php)

Bắt đầu code thôi. Trong hàm handle() các bạn viết như sau:

$client = $this->getClient(); // lấy dữ liệu client (sẽ viết ở dưới) $credentialsPath = config('google-api.token_path'); // lấy đường dẫn đến token cũ // kiểm tra xem file token đó có đang tồn tại hay không if (file_exists($credentialsPath) // nếu có hỏi lại có muốn làm mới token này hay không && !$this->confirm('Token is ready to use! Do you want to retrieve the token?') ) { //nếu không tồn tại file token thì trả ra thông báo return $this->info('Old token still held!'); } // hàm get token $this->runGetToken($client, $credentialsPath);
Code language: PHP (php)

Các function con:

Get client

private function getClient() { $client = new \Google_Client(); // khởi tạo Google Client $client->setApplicationName('Demo Laravel'); // đặt tên cho ứng dụng (không quan trọng lắm) // cài đặt xin quyền truy cập của token, ở đây tôi đang xin truy cập đến dữ liệu Calendar và Drive $client->setScopes([ \Google_Service_Calendar::CALENDAR, \Google_Service_Drive::DRIVE, ]); $client->setAuthConfig(config('google-api.client_path')); // đường dẫn đến file credentials.json $client->setAccessType('offline'); // không rõ lắm nên cứ để vậy đi :"> return $client; }
Code language: PHP (php)

Get token

Phần này khá là phức tạp nên mình sẽ chia nhỏ function này ra

private function runGetToken(\Google_Client $client, $credentialsPath) { // Yêu cầu xác thực từ phía User $this->info("Open the following link in your browser:"); $this->comment($client->createAuthUrl()); $authCode = trim($this->ask('Enter verification code')); }
Code language: PHP (php)

Ok chạy thử phát đã, các bạn mở cửa sổ command trong thư mục Laravel của mình và chạy lệnh:

php artisan google:get-token
Code language: JavaScript (javascript)

Khi chạy các dòng này trên cửa sổ command, bạn sẽ được yêu cầu truy cập đường dẫn đã được Google tạo ra (chính là dòng màu vàng đó)32bd1423 f859 4dfd a7a1 50ab977de48e

Sau khi mở link này, các bạn sẽ được yêu cầu đăng nhập tài khoản Google, sau đó đồng ý với các quyền được yêu cầu tương ứng với các Scope mà các bạn đã khai báo trong hàm setScopes ở trên, bấm Allow để đồng ý, các bạn sẽ được cấp một đoạn mã như thế này:

000cb6f5 c5a2 4f53 a918 11ccb41d9feb

Cứ tạm để nó đó, chúng ta viết tiếp code cho function runGetToken

private function runGetToken(\Google_Client $client, $credentialsPath) { // Yêu cầu xác thực từ phía User $this->info("Open the following link in your browser:"); $this->comment($client->createAuthUrl()); $authCode = trim($this->ask('Enter verification code')); $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); // Kiểm tra lỗi if (array_key_exists('error', $accessToken)) { throw new \Exception(join(', ', $accessToken)); } // Lưu token vào file if (!file_exists(dirname($credentialsPath))) { mkdir(dirname($credentialsPath), 0777, true); nhớđểểquyềnn truy cậpp file là777 nhéfile_put_contents($credentialsPath, json_encode($accessToken)); $this->info("Credentials saved to {$credentialsPath}!", $credentialsPath); }
Code language: PHP (php)

Sau khi hoàn thành, bạn có thể chạy lại php artisan google:get-token để lấy token mới và dán vào phần Enter vertification code, đoạn token này sẽ được lưu lại và sử dụng sau này trong quá trình phát triển các chức năng tương tác với API Google.

Tạo lớp lấy dữ liệu Client

Đến bước này là cũng sắp xong rồi đó, chúng ta sẽ tạo ra một Class để lấy dữ liệu Client từ token mà chúng ta đã “xin” được của Google.

Các bạn tạo một thư mục tên là Components trong thư mục app, tạo một file tên Google_Client trong thư mục này.

Và đây là code của nó:

use Google_Client as BaseGoogleClient; /** * Class GoogleClient * @package App\Components */ class GoogleClient { /** * @var BaseGoogleClient */ protected $client; /** * GoogleClient constructor. * @param BaseGoogleClient $client */ public function __construct(BaseGoogleClient $client) { $this->client = $client; } /** * @return BaseGoogleClient * @throws \Exception */ public function getClient() { //kiểm tra credentials và token có tồn tại hay không if (!file_exists(config('google-api.client_path'))) { throw new \Exception( 'You have not create client for application.' .' Please create on "console.google.com" and save to your storage "storage/google/credentials.json"!' ); } $this->client->setAuthConfig(config('google-api.client_path')); $this->client->setAccessType('offline'); $credentialsPath = config('google-api.token_path'); if (!file_exists($credentialsPath)) { throw new \Exception('Do not receive access token. Please run command "php artisan google:get-token" to get token!'); } $accessToken = json_decode(file_get_contents($credentialsPath), true); $this->client->setAccessToken($accessToken); // nếu token hết hạn sẽ tiến hành refresh lại token để sử dụng if($this->client->isAccessTokenExpired()) { $this->client->fetchAccessTokenWithRefreshToken($this->client->getRefreshToken()); file_put_contents($credentialsPath, json_encode($this->client->getAccessToken())); } return $this->client; } }
Code language: PHP (php)

OK vậy là bạn đã có một Goravel “ngon” cho các công việc liên quan đến API Google sau này rồi. Để sử dụng cũng rất đơn giản, chỉ cần inject vào hàm __construct trong class giống như sau:

use App\Components\GoogleClient; // protected $client; // public function __construct(GoogleClient $client) { $this->client = $client->getClient(); }
Code language: PHP (php)

Sau đó bạn có thể dùng $this->client này để làm gì tùy thích :v

Nếu muốn cài đặt thêm quyền chỉ cần quay lại hàm getClient() trong file command GoogleGetToken thêm vào là xong.

Có thể mình sẽ làm thêm một series về cách sử dụng Goravel này cộng với một số API phổ biến của Google như là Calendar, Drive, Mail,… Rất mong mọi người ủng hộ.

Các bạn có thể tham khảo các bài viết hay về Laravel tại đây.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.

Tham khảo: https://viblo.asia/p/google-api-laravel-setup-mot-project-goravel-hoan-hao-aWj53OA856m

Leave a Reply

Your email address will not be published. Required fields are marked *