Chào các bạn. Như đã biết thì Google API client library sẽ cho phép chung ta sử dụng rất nhiều dịch vụ của Google như Google+, Drive, Google Map, Yotube,…và hôm nay tôi sẽ hướng dẫn các bạn cách sử dụng nó để đăng nhập vào website. Và tất nhiên để sử dụng thư viện này chúng ta cần phải có Client id và Secret key và đây là cách để lấy Client id và Secret key từ Google API Console.
Mục tiêu: Đăng nhập hoặc tạo mới 1 account với Google API
Yêu cầu cho project này:
- PHP version 5.4 hoặc cao hơn
- Client id và Secret Key
- Thư viện Google API client library for php
- Cấu trúc folder:
project /google_api/login
(bạn có thể thay đổi theo cách của bạn)
1. Tạo database
Việc đầu tiên là tạo 1 database với cấu trúc table như sau:
Bài viết này được đăng tại [kiso.vn]
CREATE TABLE IF NOT EXISTS `google_users` ( `google_id` decimal(21,0) NOT NULL, `google_name` varchar(60) NOT NULL, `google_email` varchar(60) NOT NULL, `google_link` varchar(60) NOT NULL, `google_picture_link` varchar(200) NOT NULL, PRIMARY KEY (`google_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
2. Tải thư viện Google API client
Có 2 cái cách để tải:
Cách 1: Tải trực tiếp từ Github thông qua link này. Sau khi tải về bạn giải nén và copy tất cả bỏ vào thư mục login/
Cách 2: Sử dụng composer để tải về:
Mở thư mục /google_api/login/
và tạo 1 file composer.json
với nội dung
{ "require": { "google/apiclient": "1.0.*@beta" } }
Sau đó trên command line chạy lệnh: Composer install và một folder vendor sẽ xuất hiện trong code của bạn
3. Tạo page login và xử lý thôi
Tạo 1 page login.php
trong thư mục google_api/login/
với nội dung
<?php require_once '/vendor/autoload.php'; // Lấy những giá trị này từ https://console.google.com $client_id = '81678134426-j16al8im2mbsetfse3dv43svgvcs3cr8.apps.googleusercontent.com'; $client_secret = '6d69gLy991-1H-mxDnUQD8dg'; $redirect_uri = 'http://kiso.app/google_api/login/login.php'; //Thông tin kết nói database $db_username = "root"; //Database Username $db_password = ""; //Database Password $host_name = "localhost"; //Mysql Hostname $db_name = 'free_tuts'; //Database Name ################################################################### $client = new Google_Client(); $client->setClientId($client_id); $client->setClientSecret($client_secret); $client->setRedirectUri($redirect_uri); $client->addScope("email"); $client->addScope("profile"); $service = new Google_Service_Oauth2($client); // Nếu kết nối thành công, sau đó xử lý thông tin và lưu vào database if (isset($_GET['code'])) { $client->authenticate($_GET['code']); $_SESSION['access_token'] = $client->getAccessToken(); //header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); $user = $service->userinfo->get(); //get user info // connect to database $mysqli = new mysqli($host_name, $db_username, $db_password, $db_name); if ($mysqli->connect_error) { die('Error : ('. $mysqli->connect_errno .') '. $mysqli->connect_error); } //Kiểm tra xem nếu user này đã tồn tại, sau đó nên login tự động $result = $mysqli->query("SELECT COUNT(google_id) as usercount FROM google_users WHERE google_id=$user->id"); $user_count = $result->fetch_object()->usercount; //will return 0 if user doesn't exist //show user picture echo '<img src="'.$user->picture.'" style="float: right;margin-top: 33px;" />'; if($user_count) // Nếu user tồn tại thì show thông tin hiện có { echo 'Welcome back '.$user->name.'! [<a href="'.$redirect_uri.'?logout=1">Log Out</a>]'; } else //Ngược lại tạo mới 1 user vào database { echo 'Hi '.$user->name.', Thanks for Registering! [<a href="'.$redirect_uri.'?logout=1">Log Out</a>]'; $statement = $mysqli->prepare("INSERT INTO google_users (google_id, google_name, google_email, google_link, google_picture_link) VALUES (?,?,?,?,?)"); $statement->bind_param('issss', $user->id, $user->name, $user->email, $user->link, $user->picture); $statement->execute(); echo $mysqli->error; } exit; } //Nếu sẵn sàng kết nối, sau đó lưu session với tên access_token if (isset($_SESSION['access_token']) && $_SESSION['access_token']) { $client->setAccessToken($_SESSION['access_token']); } else { // Ngược lại tạo 1 link để login $authUrl = $client->createAuthUrl(); } //Hiển thị button để login echo '<div style="margin:20px">'; if (isset($authUrl)){ //show login url echo '<div align="center">'; echo '<h3>Login with Google -- Demo</h3>'; echo '<div>Please click login button to connect to Google.</div>'; echo '<a class="login" href="' . $authUrl . '">LOGIN</a>'; echo '</div>'; } echo '</div>';
Truy cập link http://locahost/google_api/login/login.php
và xem kết quả
4. Lời kết
Trong bài viết này có đề cập đến chức năng sử dụng composer để quản lý các thư viện và các để lấy Client ID và Secret key từ google api console. Tôi sẽ hướng dẫn chi tiết vào bài viết khác.
Nếu bạn có bất kỳ vấn đề gì trong quá trình tích hợp hãy để lại comment bên dưới. Tôi sẽ trả lời sớm nhất.
Bài viết liên quan
[CSF-2] Một số thiết lập CSF, LFD
Hôm nay mình sẽ thực hiện một số thiết lập trên CSF Mở file config để sửa đổi một số tính năng dưới /etc/csf/csf.conf Nội dung chính1. Tạo database2. Tải thư viện Google API client3....
[CSF-1] Tăng bảo mật Server với ConfigServer Firewall (CSF)
Nội dung chính1. Tạo database2. Tải thư viện Google API client3. Tạo page login và xử lý thôi4. Lời kết1. Khái niệm CSF: CSF (ConfigServer & Firewall) là một bộ ứng dụng hoạt động trên...
Sử dụng SSH Key với Gitlab và Github
Bài viết này mình sẽ hướng dẫn các bạn tạo ssh key cho Gitlab và Github SSH là gì? Secure Socket Shell là một giao thức mạng dùng để thiết lập kết nối mạng một...
Directory traversal vulnerabilities (phần 4)
Nội dung chính1. Tạo database2. Tải thư viện Google API client3. Tạo page login và xử lý thôi4. Lời kếtV. Phân tích và khai thác các lỗ hổng Directory traversal (tiếp) 5. Bypass lỗ hổng...
Directory traversal vulnerabilities (phần 3)
Nội dung chính1. Tạo database2. Tải thư viện Google API client3. Tạo page login và xử lý thôi4. Lời kếtV. Phân tích và khai thác các lỗ hổng Directory traversal 1. Lỗ hổng xảy ra...
Directory traversal vulnerabilities (phần 2)
Nội dung chính1. Tạo database2. Tải thư viện Google API client3. Tạo page login và xử lý thôi4. Lời kếtIII. Vì sao lỗ hổng Directory traversal xuất hiện? Với mỗi ngôn ngữ lập trình khác...