Tools

Rất nhiều các dịch vụ của Google có thể truy cập và ứng dụng vào dự án PHP của bạn thông qua các API mà chính Google cung cấp. Google cung cấp sẵn các thư viện này ở đây:   google-api-php-client. Có thể tải về và cài đặt thủ công vào dự án nhưng nên dùng Composer để tích hợp bằng cách gõ lệnh sau để thư viện đó tích hợp vào dự án (trong thư mục vendoer):

composer require google/apiclient:^2.0

Như vậy đã có thư viện, đảm bảo load thư viện băng cách thêm mã: include "vendor/autoload.php"; khi dùng.

Sử dụng xác thực OAuth tài khoản Google Plus

Dịch vụ này cho phép người dùng cung cấp các thông tin xác thực, như để đăng nhập vào website của bạn chẳng hạn. Người dùng sẽ được chuyển hưởng đến dịch vụ của Google và Google sẽ cung cấp lại các thông tin cần thiết để xác thực như ID, username, email ... tùy thuộc vào sự cho phép của người dùng ... (thông tin và quyền hạn do bạn thiết lập - thường thì với login thì bạn chỉ cần xin email của người dùng là đủ).

Để sử dụng được API của Google trước tiên bạn cần có một dự án (ứng dụng) tại Google API:

Tạo ứng dụng (dự án) Google API

Bạn phải có một tài khoản Google Console tại https://console.developers.google.com/ vậy hãy đăng ký tài khoản này trước. Sau đó bấm vào mục Create Project, đồng ý với các điều khoản để tạo dự án của bạn.

Tạo Credentials: Đây là mã để ứng dụng của bạn truy cập dịch vụ. Bạn chọn dự án mới tạo ra, chọn đến mục Credentials để tạo mới. Khi bấm vào Create Credential, chọn mục OAuth client ID.

google-api

Tiếp theo bấm vào OAuth consent screen để cấu hình thông tin sẽ hiện thị khi xin quyền từ người dùng. Bạn nhập vào tên ứng dụng đăng nhập của bạn và tùy chọn thêm (không cũng được) cung cấp một logo (Logo xuất hiện khi hỏi người dùng cho phép cung cấp xác thực), cung cấp các đường dẫn URL đến Website của bạn như trang Privacy, Term ... Đảm bảo tuân thủ chính sách của Google - thông tin rõ ràng đến người dùng khi xin quyền truy cập thông tin tài khoản của họ

Sau khi Save lại, màn hình hiện ra chọn Web application. Nhập vào thêm các thông tin (quan trọng)

  • Tên ứng dụng đăng nhập
  • Url đến website (ví dụ http://xuanthulab.net).
  • Authorized redirect URIs: (rất quan trọng) - là đường dẫn chính xác đến trang xác thực (login) bằng tài khoản Google với user của bạn. Trang này là trang mà sau khi người dùng xác thực từ Google, Google sẽ chuyển hướng và cấp thông tin đến Url này (và bạn phải lập trình để lấy thông tin này). Ví dụ Url này như sau: http://xuanthulab.net/logingoogle.php - bạn chỉ có thể thiết lập để Google chuyển thông tin đến những URL khai báo ở đây
  • Sau khi tạo xong bạn sẽ được cung cấp Client IDClient serect. Lấy lại hai mã này để sử dụng trong ứng dụng của bạn (bạn phải giữ bí mật mã này). Hai mã này có dạng ví dụ 537075956582-2kvdcqff03254g53pjgond5a5f4pn7fv.apps.googleusercontent.com và serect là: 5FgFikxxxxxxxxxxIvO2mvFE.

Như vậy bước chuẩn bị đã xong, cơ bản bước này bạn cần một tài khoản Google Console, mã Client ID, Client SerectUrl mà Google sẽ chuyển hướng thông tin cho bạn.

Lập trình PHP với Google Client để đăng nhập website

Mục tiêu là sử dụng OAuth của Google để cho phép người dùng đăng nhập vào website của bạn, cụ thể như sau:

  • Nếu người dùng truy cập vào trang đăng nhập (mà chữa có thông tin đăng nhập trong Session) thì ứng dụng sẽ chuyển hướng đến OAuth của Google để yêu cầu thông tin từ người dùng - Trang đăng nhập của bạn có URL do bạn thiết kế, ví dụ http://xuanthulab.net/logingoogle.php
  • Nếu người dùng đồng ý xác thực với tài khoản Google - Google sẽ gửi thông tin là mã Token đến URL trên trang của bạn - từ mã này cùng với thư viện google/apiclient bạn có thể đọc để lấy thông tin như Email, tên, tuổi ... (tùy thuộc vào các thông tin bạn xin).

Dưới đây là mã PHP dành cho URL (trang) khi người dùng đăng nhập, cũng là URL mà Google gửi thông tin (http://xuanthulab.net/logingoogle.php)

Nội dung file logingoogle.php

<?php
    /**
     * Trang này để lấy thông tin đăng nhập từ google, nếu chưa đăng nhập sẽ mở popup để xác thực từ Google
     */
    include "vendor/autoload.php";


    /** getinfo: Hàm này lấy thông tin User sau khi đã xác thực thành công, nên chuyển hàm này vào file khác
     * @param $client Google_Client
     * @return mixed
     */
    function getinfo($client) {

        $client->setAccessToken($_SESSION['access_token']);
        $plus = new Google_Service_Plus($client);

        if ($client->isAccessTokenExpired()) {
            //Truy cập bị hết hạn, cần xác thực lại
            //Chuyển hướng sang Google để lấy xác thực
            $auth_url = $client->createAuthUrl();
            header("Location: $auth_url");
            die();
        }


        //Lấy các thông tin của User
        $me = $plus->people->get('me');
        $id    = @$me['id'];                    //ID
        $email = @$me['emails'][0]['value'];    //Địa chỉ email
        $name  = @$me['displayName'];           //Tên
        $image = @$me['image']['url'];          //Url của ảnh avatar

        var_dump($id, $email, $name);
        

        /***
            Đến đây bạn đã có $email, $id, $name ... từ tài khoản Google của người dùng
            Từ thông tin này bạn cho phép đăng nhập (xác thực, đăng ký ...) trên website của bạn
            mà không cần thiết phải yêu cầu nhập các thông tin khác (password, xác thực email ...)

        ***/

    }


    /***
     *
     * TRANG ĐĂNG NHẬP VỚI GOOGLE CLIENT
     *
     ***/


    $client = new Google_Client();

    $redirecturi = "http://xuanthulab.net/logingoogle.php";  // URL này được Google chuyển hướng, khi người dùng đồng ý

    $client->setRedirectUri($redirecturi);

    // Khai báo xin các quyền truy cập: lấy email, tên, ID người dùng ...
    // Tham khảo các quyền khác Scope: https://developers.google.com/identity/protocols/googlescopes
    $client->addScope([
        'https://www.googleapis.com/auth/plus.login',
        'https://www.googleapis.com/auth/userinfo.email'
    ]);



    //Set param google API
    $client->setClientId('điền mã Client ID đã cấp');
    $client->setClientSecret('điền mã Secret đã cấp');
    $client->setAccessType('offline');

    //Đây là URL đến Google, bạn cần mở nếu chưa đăng nhập
    $auth_url = $client->createAuthUrl();


    if (isset($_SESSION['access_token']) && $_SESSION['access_token'])
    {
        /*
         * Đã đăng nhập trước rồi do tồn tại access_token trong Session
         * Nên bạn không cần xác thực từ Google nữa mà chỉ việc lấy thông tin
         */

        getinfo($client);

    }
    else
    {
        /**
         * Nếu tồn tại $_GET['code'] trên URL có nghĩa là Google vừa gửi Code truy cập tới cho bạn, bạn cần lấy thông
         * tin này để truy cập.
         */
        if (isset($_GET['code'])) {
            $client->fetchAccessTokenWithAuthCode($_GET['code']);
            //Lấy mã Token và lưu lại tại SESSION
            $_SESSION['access_token'] = $client->getAccessToken();
            getinfo($client);
        }
        else
        {
            //Chuyển hướng sang Google để lấy xác thực
            $auth_url = $client->createAuthUrl();
            header("Location: $auth_url");
            die();
        }
    }

Đăng ký nhận bài viết mới