Hướng dẫn auth0-php example - ví dụ auth0-php

Vietnamese (Tiếng Việt) translation by Andrea Ho (you can also view the original English article) Andrea Ho (you can also view the original English article)

Trong bài viết này, chúng ta sẽ khám phá Auth0, là một dịch vụ cung cấp xác thực và ủy quyền. Auth0 cho phép bạn thiết lập các tính năng xác thực và ủy quyền cơ bản cho ứng dụng của bạn trong nháy mắt.

Auth0 là gì?

Auth0 là một công cụ dịch vụ xác thực giúp việc triển khai các tính năng liên quan đến xác thực trong website của bạn trở nên dễ dàng. Nếu bạn đã xây dựng một ứng dụng và bạn chỉ muốn thuê ngoài các tính năng xác thực và ủy quyền , vậy bạn nên cân nhắc sử dụng một dịch vụ như Auth0.

Hãy để tôi nhanh chóng tóm tắt Auth0 cung cấp những tính năng gì:

  • xác thực một lần (single sign-on)
  • xác thực 2 yếu tố (multifactor authentication)
  • Đăng nhập không cần mật khẩu
  • quản lý người dùng
  • và nhiều nữa

Trong bài viết này, chúng tôi sẽ giới thiệu một số phương pháp đăng nhập một lần (sso) mà bạn có thể triển khai trong các ứng dụng web của mình để tận dụng các tính năng xác thực do dịch vụ Auth0 cung cấp.

Trong phần đầu của bài viết, chúng tôi sẽ nghiên cứu cách thiết lập chức năng xác thực cơ bản trong ứng dụng web PHP từ phía máy chủ. Trong phần còn lại, tôi sẽ giải thích cách làm thế nào để bạn có thể bảo mật các API tùy biến của mình bằng cách thiết lập ủy quyền OAuth bằng dịch vụ Auth0.

Tích hợp xác thực phía máy chủ

Trong phần này, chúng tôi sẽ giới thiệu cho các bạn cách nhanh chóng thiết lập xác thực cơ bản cho các ứng dụng web từ phía máy chủ bằng cách sử dụng Auth0. Trong thực tế, đội ngũ Auth0 đã hỗ trợ một sample trên GitHub để minh hoạ các ví dụ cơ bản, vậy chúng tôi sẽ sử dụng chúng thay vì phải tự tạo các ví dụ mới.

Trước khi tiếp tục, hãy bảo đảm Composer đã được thiết lập để cài đặt các SDK Auth0 bằng cách sử dụng file

cd 00-Starter-Seed
composer install
4. Ngoài ra, nếu bạn muốn bắt kịp các ví dụ trong bài viết này, hãy tạo cho mình một tài khoản miễn phí với Auth0.

Thiết lập dự án

Hãy clone những ví dụ của dự án mẫu.

git clone https://github.com/auth0-samples/auth0-php-web-app.git .

Tiếp tục chạy lệnh

cd 00-Starter-Seed
composer install
5 để cài đặt các dependencies (gói phụ thuộc).

cd 00-Starter-Seed
composer install

Theo file composer.json, cần cài đặt các gói

cd 00-Starter-Seed
composer install
6 và
cd 00-Starter-Seed
composer install
7.composer.json, cần cài đặt các gói
cd 00-Starter-Seed
composer install
6 và
cd 00-Starter-Seed
composer install
7.

{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}

Thư viện

cd 00-Starter-Seed
composer install
6 dùng để khởi tạo các biến môi trường từ file .env. Do đó, nó cho phép bạn tách việc cấu hình khỏi code, vì code thay đổi giữa các môi trường..env. Do đó, nó cho phép bạn tách việc cấu hình khỏi code, vì code thay đổi giữa các môi trường.

Mặt khác, gói

cd 00-Starter-Seed
composer install
7 sẽ giúp chúng tôi thiết lập ủy quyền trong ứng dụng của mình.

Tiếp theo, hãy thiết lập cấu hình cho ứng dụng của chúng ta trong file .env. Tiếp tục tạo file .env bằng cách copy nó từ file .env.example..env. Tiếp tục tạo file .env bằng cách copy nó từ file .env.example.

cp .env.example .env

File này chứa các giá trị cấu hình sẽ được thư viện Auth0 sử dụng.

AUTH0_CLIENT_ID={CLIENT_ID}
AUTH0_DOMAIN={DOMAIN_NAME}
AUTH0_CLIENT_SECRET={CLIENT_SECRET}
AUTH0_CALLBACK_URL={CALLBACK_URL}
AUTH0_AUDIENCE=

Bạn sẽ có thể tìm thấy hầu hết các thiết lập trong Applications > Default App > Settings trên trang dashboard của của Auth0. Chú ý rằng tôi đang sử dụng ứng dụng mặc định hệ thống tạo ra. Tất nhiên, bạn có thể tiếp tục và tạo một ứng dụng mới nếu bạn muốn thế.Applications > Default App > Settings trên trang dashboard của của Auth0. Chú ý rằng tôi đang sử dụng ứng dụng mặc định hệ thống tạo ra. Tất nhiên, bạn có thể tiếp tục và tạo một ứng dụng mới nếu bạn muốn thế.

{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
0 là URL của ứng dụng của bạn, là nơi mà Auth0 sẽ chuyển hướng người dùng đến sau khi đăng nhập và đăng xuất. Giá trị bạn đặt trong trường này phải được định cấu hình trong
{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
1 trong cấu hình của ứng dụng trên trang dashboard của Auth0.

Bạn sẽ tìm thấy 3 file chủ chốt để thực hiện hầu hết logic xác thực.

  • index.php: Đây là trang chính hiển thị nút đăng nhập hoặc đăng xuất dựa trên trạng thái của người dùng.: Đây là trang chính hiển thị nút đăng nhập hoặc đăng xuất dựa trên trạng thái của người dùng.
  • login.php: đoạn mã này sẽ được khởi tạo khi bạn click vào nút đăng nhập, và nó sẽ chuyển hướng người dùng đến giao diện đăng nhập của Auth0. Sau khi đăng nhập, họ sẽ được chuyển hướng trở lại
    {
        "name": "auth0/basic-webapp-sample",
        "description": "Basic sample for securing a WebApp with Auth0",
        "require": {
             "vlucas/phpdotenv": "2.4.0",
             "auth0/auth0-php": "~5.0"
        },
        "license": "MIT",
        "authors": [
            {
                "name": "Martin Gontovnikas",
                "email": ""
            },
            {
                "name": "Germán Lena",
                "email": ""
            }
        ]
    }
    0.
    : đoạn mã này sẽ được khởi tạo khi bạn click vào nút đăng nhập, và nó sẽ chuyển hướng người dùng đến giao diện đăng nhập của Auth0. Sau khi đăng nhập, họ sẽ được chuyển hướng trở lại
    {
        "name": "auth0/basic-webapp-sample",
        "description": "Basic sample for securing a WebApp with Auth0",
        "require": {
             "vlucas/phpdotenv": "2.4.0",
             "auth0/auth0-php": "~5.0"
        },
        "license": "MIT",
        "authors": [
            {
                "name": "Martin Gontovnikas",
                "email": ""
            },
            {
                "name": "Germán Lena",
                "email": ""
            }
        ]
    }
    0.
  • logout.php: file lệnh này sẽ được khởi tạo khi bạn nhấp vào nút đăng xuất và nó sẽ chuyển hướng người dùng đến Auth0 ở chế độ chạy nền, cho người dùng đăng xuất và đưa họ về AUTH0_CALLBACK_URL.

Những file chủ yếu của dự án

Hãy điểm qua từng file lúc ban động của dự án.

Login Script

Chúng ta sẽ bắt đầu với file login.php.

 $domain,
  'client_id' => $client_id,
  'client_secret' => $client_secret,
  'redirect_uri' => $redirect_uri,
  'audience' => $audience,
  'scope' => 'openid profile',
  'persist_id_token' => true,
  'persist_access_token' => true,
  'persist_refresh_token' => true,
]);

$auth0->login();

Lúc đầu, chúng tôi đã bao gồm các autoloaders; các file này đảm nhiệm việc tải Auth0 và các class có liên quan đến các biến môi trường. Tiếp theo, chúng ta khởi tạo các biến định cấu hình từ file .env thông qua hàm

{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
3..env thông qua hàm
{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
3.

Tiếp theo, chúng tôi khởi tạo đối tượng Auth0 và gọi phương thức đăng nhập để chuyển hướng người dùng đến Auth0 cho việc đăng nhập. Khi đăng nhập, người dùng sẽ được chuyển hướng trở lại website của chúng tôi.

Bạn có thể đăng nhập bằng tài khoản xã hội như Facebook, Google và các tài khoản tương tự hoặc tạo tài khoản mới trong khi đăng nhập. Trong cả hai trường hợp, Auth0 sẽ tạo các bản ghi cho người dùng mới ở trên thiết bị của họ. Bạn có thể bật các đăng nhập qua xã hội khác nhau trong phần Connections > Social trên trang dashboard của Auth0. Ngoài ra, bạn có thể kiểm tra danh sách người dùng đã đăng nhập bằng cách sử dụng Auth0 trên trang dashboard của Auth0 bên dưới liên kết Users.Connections > Social trên trang dashboard của Auth0. Ngoài ra, bạn có thể kiểm tra danh sách người dùng đã đăng nhập bằng cách sử dụng Auth0 trên trang dashboard của Auth0 bên dưới liên kết Users.

The Logout Script

Tiếp theo, chúng ta hãy xem nhanh file logout.php.logout.php.

 $domain,
  'client_id' => $client_id,
  'client_secret' => $client_secret,
  'redirect_uri' => $redirect_uri,
  'audience' => $audience,
  'scope' => 'openid profile',
  'persist_id_token' => true,
  'persist_refresh_token' => true,
]);

$auth0->logout();
$return_to = 'https://' . $_SERVER['HTTP_HOST'];
$logout_url = sprintf('http://%s/v2/logout?client_id=%s&returnTo=%s', $domain, $client_id, $return_to);
header('Location: ' . $logout_url);
die();

File này hoạt động khá giống với file login.php, ngoại trừ việc nó sẽ được gọi khi người dùng đăng xuất. Phương thức

{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
4 được gọi để vô hiệu một phiên người dùng trong ứng dụng của bạn. Sau đó, người dùng sẽ được chuyển hướng đến Auth0 vì thế dịch vụ được thông báo về hoạt động đăng xuất của người dùng. Cuối cùng, người dùng sẽ được chuyển hướng trở lại ứng dụng của bạn.login.php, ngoại trừ việc nó sẽ được gọi khi người dùng đăng xuất. Phương thức
{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
4 được gọi để vô hiệu một phiên người dùng trong ứng dụng của bạn. Sau đó, người dùng sẽ được chuyển hướng đến Auth0 vì thế dịch vụ được thông báo về hoạt động đăng xuất của người dùng. Cuối cùng, người dùng sẽ được chuyển hướng trở lại ứng dụng của bạn.

The Index File

Cuối cùng, chúng ta hãy xem qua file index.php, đây là entry point (điểm bắt đầu) của ứng dụng.index.php, đây là entry point (điểm bắt đầu) của ứng dụng.

 $domain,
    'client_id' => $client_id,
    'client_secret' => $client_secret,
    'redirect_uri' => $redirect_uri,
    'audience' => $audience,
    'scope' => 'openid profile',
    'persist_id_token' => true,
    'persist_access_token' => true,
    'persist_refresh_token' => true,
  ]);
  $userInfo = $auth0->getUser();
?>

    
        

        

        
        
        

        
    
    
        

Ở đây, chúng tôi đã sử dụng phương thức

{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
5 của đối tượng
{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
6 để xem liệu có phiên nào đang hoạt động. Nếu không có, chúng tôi sẽ hiển thị liên kết Sign In, đưa người dùng đến login.php và bắt đầu khởi tạo luồng đăng nhập. Mặt khác, chúng tôi sẽ chào đón người dùng và hiển thị liên kết Logout nếu người dùng đã đăng nhập.Sign In, đưa người dùng đến login.php và bắt đầu khởi tạo luồng đăng nhập. Mặt khác, chúng tôi sẽ chào đón người dùng và hiển thị liên kết Logout nếu người dùng đã đăng nhập.

Vậy đấy là phần triển khai luồng xác thực cơ bản cho ứng dụng từ máy chủ.

Bảo mật cho API tùy biến của bạn cùng OAuth2

Trong phần này, chúng tôi sẽ xem làm sao bạn có thể bảo mật các API tùy chỉnh của mình bằng cách triển khai luồng cấp phép code OAuth2. Tôi hy vọng bạn đã quen thuộc với quy trình cấp phép chuẩn của mã ủy quyền vì chúng tôi sẽ bàn vào chi tiết về việc đó. Hãy xem một số bài viết khác của chúng tôi ở đây trên Envato Tuts+ nếu bạn muốn tìm hiểu về OAuth2.

Thay vào đó, chúng tôi sẽ lập tức đào sâu vào việc triển khai thực tế. Hãy tiếp tục tạo file auth_code_grant_example.php với các nội dung như sau.auth_code_grant_example.php với các nội dung như sau.

 '{AUDIENCE}',
      'scope' => 'profile',
      'response_type' => 'code',
      'client_id' => '{CLIENT_ID}',
      'state' => 'SomeRandomString',
      'redirect_uri' => '{CALLBACK_URL}'
    );

    $_SESSION['oauth2state']=$params['state'];
    $str_params = '';
    foreach($params as $key=>$value) {
      $str_params .= $key . "=" . urlencode($value) . "&";
    }
    ?>

    
      Sign In
    
 'authorization_code',
      'client_id' => '{CLIENT_ID}',
      'client_secret' => '{CLIENT_SECRET}',
      'code' => $_GET['code'],
      'redirect_uri' => '{CALLBACK_URL}'
    );

    $str_params = '';
    foreach($params as $key=>$value) {
      $str_params .= $key . "=" . urlencode($value) . "&";
    }

    $curl = curl_init();

    curl_setopt_array($curl, array(
      CURLOPT_URL => "https://{AUTH0_DOMAIN}/oauth/token",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => $str_params
    ));

    $curl_response = curl_exec($curl);
    $curl_error = curl_error($curl);

    curl_close($curl);

    if ($curl_error) {
      echo "Error in the CURL response:" . $curl_error;
    } else {
      $arr_json_data = json_decode($curl_response);

      if (isset($arr_json_data->access_token)) {
        $access_token = $arr_json_data->access_token;
        $curl = curl_init();

        curl_setopt_array($curl, array(
          CURLOPT_URL => "http://{YOUR_API_DOMAIN}/demo_api_server.php",
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_CUSTOMREQUEST => "GET",
          CURLOPT_HTTPHEADER => array(
            "Authorization: Bearer {$access_token}"
          )
        ));

        $curl_response = curl_exec($curl);
        $curl_error = curl_error($curl);

        curl_close($curl);

        if ($curl_error) {
          echo "Error in the CURL response from DEMO API:" . $curl_error;
        } else {
          echo "Demo API Response:" . $curl_response;
        }
      } else {
        echo 'Invalid response, no access token was found.';
      }
    }
}

Chúng ta hãy xem code này hoạt động như thế nào!

Bắt đầu luồng uỷ quyền (Authorization Flow)

Đầu tiên, chúng tôi đã chuẩn bị một liên kết gửi người dùng đến máy chủ Auth0 để bắt đầu luồng ủy quyền.

// Check if we need to show the "Sign In" link
$params = array (
  'audience' => '{AUDIENCE}',
  'scope' => 'profile',
  'response_type' => 'code',
  'client_id' => '{CLIENT_ID}',
  'state' => '{SOME_RANDOM_STRING}',
  'redirect_uri' => '{CALLBACK_URL}'
);

$_SESSION['oauth2state']=$params['state'];
$str_params = '';
foreach($params as $key=>$value) {
  $str_params .= $key . "=" . urlencode($value) . "&";
}
?>


  Sign In

Hãy thay thế

{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
7,
{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
8 và
{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
9 bằng các giá trị tương ứng với ứng dụng của bạn. Thông số
{
    "name": "auth0/basic-webapp-sample",
    "description": "Basic sample for securing a WebApp with Auth0",
    "require": {
         "vlucas/phpdotenv": "2.4.0",
         "auth0/auth0-php": "~5.0"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "Martin Gontovnikas",
            "email": ""
        },
        {
            "name": "Germán Lena",
            "email": ""
        }
    ]
}
7 phải được thay thế bằng giá trị của Identifier - được lưu ở trong API > {YOUR API APPLICATION} > Settings trên trang dashboard của Auth0.Identifier - được lưu ở trong API > {YOUR API APPLICATION} > Settings trên trang dashboard của Auth0.

{SOME_RANDOM_STRING} nên được thay thế bằng một giá trị duy nhất và phải khó đoán. Chuỗi này được sử dụng để ngăn chặn các cuộc tấn công CSRF. Ngoài ra, hãy đảm bảo việc thay thế

cp .env.example .env
1 bằng tên miền của bạn, như đã thảo luận trước đó. nên được thay thế bằng một giá trị duy nhất và phải khó đoán. Chuỗi này được sử dụng để ngăn chặn các cuộc tấn công CSRF. Ngoài ra, hãy đảm bảo việc thay thế
cp .env.example .env
1 bằng tên miền của bạn, như đã thảo luận trước đó.

Nhận Access Token (mã truy cập)

Khi người dùng nhấp vào liên kết Sign In, họ sẽ được đưa đến máy chủ Auth0 để xác thực. Sau khi xác thực, họ sẽ được yêu cầu cho phép ứng dụng truy cập vào trang hồ sơ của bạn. Sau khi ủy quyền, người dùng sẽ được chuyển hướng trở lại ứng dụng của bạn với

cp .env.example .env
2 dưới dạng tham số
cp .env.example .env
3.Sign In, họ sẽ được đưa đến máy chủ Auth0 để xác thực. Sau khi xác thực, họ sẽ được yêu cầu cho phép ứng dụng truy cập vào trang hồ sơ của bạn. Sau khi ủy quyền, người dùng sẽ được chuyển hướng trở lại ứng dụng của bạn với
cp .env.example .env
2 dưới dạng tham số
cp .env.example .env
3.

Tiếp theo, chúng ta có thể trao đổi

cp .env.example .env
2 này để lấy acess token.

cd 00-Starter-Seed
composer install
0

Như bạn có thể thấy, cần phải call CURL để lấy access token.

Gọi API Endpoint tuỳ biến của bạn

Khi bạn có access token, bạn có thể gọi API endpoint tùy biến của mình bằng cách bao gồm nó vào header.

cd 00-Starter-Seed
composer install
1

Một API Endpoint được Auth0 bảo vệ

File API tài nguyên ảo demo_api_server.php có thể trông như sau:demo_api_server.php có thể trông như sau:

cd 00-Starter-Seed
composer install
2

Hãy nhanh chóng xem kỹ các phần quan trọng của code này.

Xác thực Access Token

Bạn có trách nhiệm xác thực access token trước khi cấp quyền truy cập vào tài nguyên đang được bảo vệ. Đó chính xác là những gì chúng tôi đã làm trong đoạn đoạn code sau. Chúng tôi đã sử dụng class tiện ích

cp .env.example .env
5 để xác thực access token.

cd 00-Starter-Seed
composer install
3

cp .env.example .env
6 nên được thay thế bằng giá trị của Signing Algorithm được tìm thấy ở APIs > {YOUR API APPLICATION} > Settings.Signing Algorithm được tìm thấy ở APIs > {YOUR API APPLICATION} > Settings.

Vậy đó là cách bạn có thể bảo vệ các API tùy chỉnh của mình nếu muốn sử dụng luồng OAuth2 của dịch vụ Auth0.

Tổng kết

Hôm nay, chúng tôi xem xét qua dịch vụ Auth0, nó cung cấp xác thực và ủy quyền làm dịch vụ. Sau khi giới thiệu dịch vụ Auth0, chúng tôi đi vào một vài ví dụ thực tế để trình bày cách làm thế nào bạn có thể tích hợp Auth0 với ứng dụng PHP của bạn.

Vui lòng gửi đề xuất và câu hỏi của bạn thông qua feed bên dưới đây!