×

Cách viết class đăng nhập qua OAuth trong PHP

Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách viết một lớp (class) đăng nhập qua OAuth bằng PHP. OAuth là một giao thức ủy quyền mà cho phép người dùng cấp quyền truy cập vào thông tin của họ mà không cần chia sẻ thông tin xác thực. Đặc biệt, phương pháp này ngày càng trở nên phổ biến trên các ứng dụng web và di động. Chúng ta sẽ đi qua từng bước từ việc tạo lớp cho đến việc sử dụng lớp này trong ứng dụng của bạn.

Tìm hiểu về OAuth

Trước khi đi vào chi tiết về cách viết class đăng nhập qua OAuth, chúng ta cần hiểu rõ về OAuth. OAuth cho phép người dùng mang lại quyền truy cập cho ứng dụng của bên thứ ba mà không cần cung cấp thông tin đăng nhập của họ. Thay vào đó, người dùng sẽ nhận được một token truy cập mà ứng dụng có thể sử dụng để gửi yêu cầu đến API của bên thứ ba. Điều này giúp tăng cường bảo mật và giảm thiểu rủi ro mất mát thông tin đăng nhập.

Từng nhà cung cấp dịch vụ (như Google, Facebook, Twitter, v.v.) sẽ có cách thức riêng để triển khai OAuth, tuy nhiên, các bước chính thường gồm:

  1. Người dùng nhấn vào nút đăng nhập với nhà cung cấp dịch vụ (như Google).
  2. Hệ thống sẽ chuyển hướng người dùng đến trang xác thực của nhà cung cấp dịch vụ.
  3. Người dùng đăng nhập và cho phép ứng dụng truy cập vào thông tin của họ.
  4. Nhà cung cấp dịch vụ trả về một mã (code) cho ứng dụng.
  5. Ứng dụng sử dụng mã này để lấy token truy cập và truy xuất thông tin người dùng.

Cài đặt các thư viện cần thiết

Trước khi viết class, chúng ta cần đảm bảo rằng đã cài đặt cURL, một thư viện rất hữu ích cho việc gửi HTTP request trong PHP. Thông thường, cURL đã được cài sẵn trên hầu hết các máy chủ. Tuy nhiên, bạn cần kiểm tra và kích hoạt nó nếu chưa có.

Viết class OAuth

Bây giờ chúng ta sẽ bắt đầu viết lớp đăng nhập qua OAuth. Đầu tiên, chúng ta sẽ định nghĩa cấu trúc cơ bản của lớp.

class OAuthLogin {
    private $clientId;
    private $clientSecret;
    private $redirectUri;
    private $providerUrl;
    private $accessToken;

    public function __construct($clientId, $clientSecret, $redirectUri, $providerUrl) {
        $this->clientId = $clientId;
        $this->clientSecret = $clientSecret;
        $this->redirectUri = $redirectUri;
        $this->providerUrl = $providerUrl;
    }

    public function getAuthorizationUrl() {
        return $this->providerUrl . '?response_type=code&client_id=' . $this->clientId . '&redirect_uri=' . urlencode($this->redirectUri);
    }

    public function obtainAccessToken($code) {
        $url = $this->providerUrl . '/token';
        $postFields = [
            'grant_type' => 'authorization_code',
            'code' => $code,
            'redirect_uri' => $this->redirectUri,
            'client_id' => $this->clientId,
            'client_secret' => $this->clientSecret
        ];

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        curl_close($ch);

        $data = json_decode($response, true);
        if (isset($data['access_token'])) {
            $this->accessToken = $data['access_token'];
            return $this->accessToken;
        }
        return null;
    }

    public function getUserInfo() {
        if (!$this->accessToken) {
            return null;
        }

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, 'https://api.provider.com/userinfo'); // URL lấy thông tin người dùng
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Authorization: Bearer ' . $this->accessToken
        ));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $response = curl_exec($ch);
        curl_close($ch);

        return json_decode($response, true);
    }
}

Hướng dẫn sử dụng class OAuthLogin

Sau khi đã viết xong class, chúng ta sẽ hướng dẫn cách sử dụng nó trong ứng dụng của mình.

Bước 1: Khởi tạo lớp OAuthLogin

Trước tiên, bạn cần khởi tạo một đối tượng của lớp này với các thông tin đã được cung cấp từ nhà cung cấp dịch vụ.

$oauth = new OAuthLogin('YOUR_CLIENT_ID', 'YOUR_CLIENT_SECRET', 'YOUR_REDIRECT_URI', 'https://provider.com/oauth/authorize');

Bước 2: Chuyển hướng người dùng đến trang xác thực

Khi người dùng muốn đăng nhập, bạn sẽ chuyển hướng họ đến URL xác thực.

header('Location: ' . $oauth->getAuthorizationUrl());
exit();

Bước 3: Xử lý mã phản hồi

Sau khi người dùng đăng nhập thành công, nhà cung cấp dịch vụ sẽ chuyển hướng người dùng trở lại YOUR_REDIRECT_URI với mã phản hồi. Bạn cần xử lý mã này để nhận token truy cập.

if (isset($_GET['code'])) {
    $code = $_GET['code'];
    $accessToken = $oauth->obtainAccessToken($code);

    if ($accessToken) {
        $userInfo = $oauth->getUserInfo();
        print_r($userInfo); // Thông tin người dùng
    } else {
        echo "Không thể lấy access token.";
    }
}

Kết luận

Sử dụng OAuth không chỉ giúp bảo vệ thông tin đăng nhập mà còn mang lại sự tiện lợi cho người dùng. Với class đã được cung cấp ở trên, bạn có thể dễ dàng tích hợp đăng nhập qua OAuth vào ứng dụng PHP của mình. Hãy nhớ rằng mỗi nhà cung cấp dịch vụ có thể có các yêu cầu khác nhau, vì vậy bạn cần tham khảo tài liệu kỹ thuật của họ để triển khai chính xác.

Hy vọng bài viết này sẽ hữu ích cho bạn trong quá trình phát triển ứng dụng của mình. Chúc bạn thành công!

Comments