Ví dụ xác thực PHP

Bạn đã bao giờ thấy mình đang xây dựng một ứng dụng và cần thêm xác thực, sợ hãi khi nghĩ đến việc thiết lập một cơ sở dữ liệu tên người dùng và mật khẩu khác chưa? . Bằng cách tận dụng API OAuth đơn giản của Okta, chúng tôi có thể vượt qua hầu hết các thách thức liên quan đến việc xác thực người dùng bằng cách để Okta xử lý các phần khó

Để làm theo hướng dẫn này, trước tiên bạn cần có tài khoản Nhà phát triển Okta. Nếu bạn chưa có tài khoản, hãy đăng ký miễn phí và quay lại đây khi bạn hoàn tất. Chúng tôi sẽ không sử dụng bất kỳ thư viện hoặc phụ thuộc PHP bên ngoài nào trong ví dụ này chỉ để giữ cho mọi thứ đơn giản

Chúng tôi sẽ bắt đầu với một tệp PHP duy nhất để minh họa trạng thái đăng nhập/đăng xuất của ứng dụng của chúng tôi. Sau đó, chúng tôi sẽ tích hợp API Okta để xác thực người dùng và tìm tên người dùng của họ sau khi họ đăng nhập. Bạn có thể sử dụng hướng dẫn này làm cơ sở để thêm xác thực vào ứng dụng thực của riêng mình

Thiết lập ứng dụng PHP mẫu

Nếu bạn muốn chuyển sang dự án đã hoàn thành, hãy xem mã nguồn trên GitHub. Bài đăng này xây dựng mã trong dự án đã hoàn thành và giải thích từng bước

Tạo một tệp mới,

function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}
0, với các nội dung sau. Điều này sẽ thiết lập hai “chế độ xem” khác nhau cho ứng dụng của chúng ta dựa trên việc người dùng có đăng nhập hay không (có tên người dùng trong phiên PHP hay không)


// Begin the PHP session so we have a place to store the username
session_start();

// If there is a username, they are logged in, and we'll show the logged-in view
if(isset($_SESSION['username'])) {
  echo '

Logged in as

'
; echo '

' . $_SESSION['username'] . '

'
; echo '

Log Out

'
; die(); } // If there is no username, they are logged out, so show them the login link if(!isset($_SESSION['username'])) { $authorize_url = 'TODO'; echo '

Not logged in

'
; echo '

Log In

'
; }

Với bộ khung đơn giản đã được tạo, chúng tôi có một nơi để bắt đầu làm việc thêm xác thực. Ứng dụng này hiện tìm kiếm "tên người dùng" trong biến phiên và coi người dùng đã đăng nhập khi được đặt

Tiếp theo, hãy thêm một hàm đơn giản mà chúng ta sẽ sử dụng khi thực hiện lệnh gọi API tới Okta. Hàm này sẽ thực hiện một yêu cầu HTTP và trả về phản hồi được giải mã JSON. Nó nhận một URL và một mảng tham số tùy chọn. Nếu có tham số, nó sẽ thực hiện yêu cầu POST với tham số là phần thân HTTP. Mặt khác, nó tạo một yêu cầu GET tới URL đã cho. Vì tất cả các lệnh gọi API mà chúng tôi đang thực hiện sẽ dẫn đến nội dung phản hồi JSON, hàm này giải mã phản hồi JSON và trả về đối tượng kết quả

function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}

Tạo một ứng dụng OAuth trong Okta

Trước khi chúng tôi có thể tiến xa hơn, chúng tôi cần định cấu hình tài khoản Nhà phát triển Okta của mình để nhận ID khách hàng và bí mật sử dụng để nói chuyện với API. Trong phần Ứng dụng của tài khoản Nhà phát triển Okta của bạn, nhấp vào Thêm ứng dụng và chọn Web. Thay đổi duy nhất mà chúng tôi cần thực hiện đối với cài đặt ứng dụng mặc định là thay đổi URL gọi lại thành

function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}
1, vì chúng tôi đang viết toàn bộ quy trình trong một tệp PHP này

Ví dụ xác thực PHP

Nhấp vào Xong và bạn sẽ được đưa đến màn hình tiếp theo nơi bạn có thể nhận ID khách hàng mới và bí mật của mình. Sao chép hai giá trị đó vào các biến bên dưới và thêm đoạn này vào đầu tệp PHP của bạn, ngay sau

function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}
2

$client_id = '';
$client_secret = '';
$redirect_uri = 'http://localhost:8080/';

Chúng tôi cũng cần tìm URL siêu dữ liệu của máy chủ ủy quyền. Từ menu trên cùng, chọn API -> Máy chủ ủy quyền. Bạn sẽ thấy một máy chủ ủy quyền trong danh sách,

function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}
3. Nhấp vào đó và sao chép URI siêu dữ liệu bên dưới máy khách và chuyển hướng các dòng

$metadata_url = 'https://{yourOktaOrg}/oauth2/default/.well-known/oauth-authorization-server';
// Fetch the authorization server metadata which contains a few URLs
// that we need later, such as the authorization and token endpoints
$metadata = http($metadata_url);

Xây dựng URL đăng nhập

Bây giờ chúng tôi đã sẵn sàng để bắt đầu xây dựng URL đăng nhập nơi chúng tôi có thể gửi cho người dùng để xác thực. Thay dòng

function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}
4 bằng đoạn mã sau

  // Generate a random state parameter for CSRF security
  $_SESSION['state'] = bin2hex(random_bytes(5));

  // Build the authorization URL by starting with the authorization endpoint
  // and adding a few query string parameters identifying this application
  $authorize_url = $metadata->authorization_endpoint.'?'.http_build_query([
    'response_type' => 'code',
    'client_id' => $client_id,
    'redirect_uri' => $redirect_uri,
    'state' => $_SESSION['state'],
    'scope' => 'openid',
  ]);

Đoạn mã này thiết lập phần đầu của luồng Mã ủy quyền OAuth. Nếu bạn muốn biết thêm chi tiết về các tham số này, tôi đã viết về luồng Mã ủy quyền trước đây trên blog này. OAuth 2 là gì. 0 Loại cấp mã ủy quyền?

Hiện tại chúng tôi đã xây dựng đủ để dùng thử. Từ dòng lệnh, điều hướng đến thư mục chứa tệp

function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}
0 của bạn và khởi động máy chủ PHP


// Begin the PHP session so we have a place to store the username
session_start();

// If there is a username, they are logged in, and we'll show the logged-in view
if(isset($_SESSION['username'])) {
  echo '

Logged in as

'
; echo '

' . $_SESSION['username'] . '

'
; echo '

Log Out

'
; die(); } // If there is no username, they are logged out, so show them the login link if(!isset($_SESSION['username'])) { $authorize_url = 'TODO'; echo '

Not logged in

'
; echo '

Log In

'
; }
1

Bây giờ bạn có thể truy cập trang này trong trình duyệt http. //127. 0. 0. 1. 8080/ và bạn sẽ thấy lời nhắc đăng nhập của mình

Ví dụ xác thực PHP

Đừng nhấp vào liên kết ngay, vì chúng tôi vẫn cần thiết lập xử lý lệnh gọi lại và nhận mã thông báo truy cập

Xử lý chuyển hướng OAuth

Khi người dùng nhấp vào URL đăng nhập, họ sẽ được gửi đến máy chủ ủy quyền Okta. Máy chủ ủy quyền sẽ yêu cầu họ đăng nhập (nếu họ chưa đăng nhập), sau đó sẽ tạo mã ủy quyền tạm thời và chuyển hướng người dùng quay lại ứng dụng này. Để xác minh rằng người dùng đã đăng nhập trên thực tế, ứng dụng cần kiểm tra xem mã ủy quyền tạm thời này có hợp lệ hay không bằng cách đổi nó lấy mã thông báo truy cập tại máy chủ ủy quyền của Okta

Giữa các dòng cấu hình ID ứng dụng khách của bạn và phần hiển thị chế độ xem đăng xuất, chúng tôi sẽ thêm một phần mới xử lý việc trao đổi mã ủy quyền để lấy mã thông báo truy cập

Hãy bắt đầu bằng cách thêm kiểm tra mã ủy quyền trong chuỗi truy vấn. Mã của bạn sẽ trông giống như thế này bây giờ


// Begin the PHP session so we have a place to store the username
session_start();

// If there is a username, they are logged in, and we'll show the logged-in view
if(isset($_SESSION['username'])) {
  echo '

Logged in as

'
; echo '

' . $_SESSION['username'] . '

'
; echo '

Log Out

'
; die(); } // If there is no username, they are logged out, so show them the login link if(!isset($_SESSION['username'])) { $authorize_url = 'TODO'; echo '

Not logged in

'
; echo '

Log In

'
; }
2

Bên trong phần mới này, thay cho nhận xét “TODO” mà chúng ta vừa thêm vào, trước tiên hãy thêm một vài phần kiểm tra lỗi. Chúng tôi sẽ bắt đầu bằng cách kiểm tra xem máy chủ ủy quyền có trả về cùng một tham số trạng thái mà chúng tôi đã đặt khi người dùng bắt đầu đăng nhập không


// Begin the PHP session so we have a place to store the username
session_start();

// If there is a username, they are logged in, and we'll show the logged-in view
if(isset($_SESSION['username'])) {
  echo '

Logged in as

'
; echo '

' . $_SESSION['username'] . '

'
; echo '

Log Out

'
; die(); } // If there is no username, they are logged out, so show them the login link if(!isset($_SESSION['username'])) { $authorize_url = 'TODO'; echo '

Not logged in

'
; echo '

Log In

'
; }
3

Cũng có thể máy chủ ủy quyền trả về lỗi ở đây, vì vậy chúng tôi sẽ hiển thị lỗi nếu điều đó xảy ra

Tiếp theo, chúng tôi cần lấy mã ủy quyền từ URL và đổi nó lấy mã thông báo truy cập tại điểm cuối mã thông báo. Để thực hiện điều này, chúng tôi sử dụng điểm cuối mã thông báo từ phản hồi siêu dữ liệu và bao gồm ID ứng dụng khách và bí mật của chúng tôi trong lệnh gọi API


// Begin the PHP session so we have a place to store the username
session_start();

// If there is a username, they are logged in, and we'll show the logged-in view
if(isset($_SESSION['username'])) {
  echo '

Logged in as

'
; echo '

' . $_SESSION['username'] . '

'
; echo '

Log Out

'
; die(); } // If there is no username, they are logged out, so show them the login link if(!isset($_SESSION['username'])) { $authorize_url = 'TODO'; echo '

Not logged in

'
; echo '

Log In

'
; }
4

Nếu mọi việc suôn sẻ, chúng ta sẽ có một mã thông báo truy cập trong đối tượng

function http($url, $params=false) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  if($params)
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
  return json_decode(curl_exec($ch));
}
6. Chúng tôi thực sự không cần mã thông báo truy cập cho bất cứ điều gì ngoại trừ việc tìm ra ai đã đăng nhập, vì vậy chúng tôi sẽ không lưu trữ nó ở bất cứ đâu. Thay vào đó, chúng tôi sẽ sử dụng nó để đưa ra yêu cầu đối với điểm cuối nội quan mã thông báo


// Begin the PHP session so we have a place to store the username
session_start();

// If there is a username, they are logged in, and we'll show the logged-in view
if(isset($_SESSION['username'])) {
  echo '

Logged in as

'
; echo '

' . $_SESSION['username'] . '

'
; echo '

Log Out

'
; die(); } // If there is no username, they are logged out, so show them the login link if(!isset($_SESSION['username'])) { $authorize_url = 'TODO'; echo '

Not logged in

'
; echo '

Log In

'
; }
6

Mã này lấy mã thông báo truy cập và gửi nó, cùng với thông tin xác thực của khách hàng, đến điểm cuối xem xét nội quan mã thông báo. Điểm cuối nội quan cho chúng tôi biết tên người dùng của người đã đăng nhập. Nếu mã thông báo đang hoạt động, chúng tôi đặt tên người dùng trong phiên, sau đó chuyển hướng trở lại trang chủ. Bây giờ tên người dùng đang ở trong phiên, "ứng dụng" của chúng tôi coi người dùng đã đăng nhập và chúng tôi thấy trang đăng nhập có địa chỉ email của người dùng

Ví dụ xác thực PHP

Hy vọng rằng đây là một minh họa hữu ích về việc thêm xác thực vào một ứng dụng PHP đơn giản dễ dàng như thế nào. Rõ ràng đây là một ví dụ tối giản và trong thực tế, ứng dụng của bạn có nhiều tính năng hơn và có thể được tổ chức tốt hơn thành nhiều tệp. Nhưng bạn sẽ có thể lấy những gì bạn đã học được ở đây và điều chỉnh nó cho phù hợp với các khuôn khổ hoặc trường hợp sử dụng khác mà bạn đang làm việc cùng

Bạn có thể xem toàn bộ mã nguồn của ứng dụng này trên GitHub tại https. //github. com/aaronpk/quick-php-authentication

Đọc thêm

Để biết thêm thông tin và hướng dẫn về OAuth, hãy xem một số bài đăng trên blog khác của chúng tôi

  • OAuth 2 là gì. 0 Loại cấp mã ủy quyền?
  • OAuth 2 là gì. 0 Loại tài trợ tiềm ẩn?
  • Xây dựng ứng dụng CRUD cơ bản với Symfony 4 và Vue
  • Bắt đầu với Spring Boot, OAuth 2. 0 và Okta

Như mọi khi, chúng tôi muốn nghe ý kiến ​​từ bạn về bài đăng này hoặc bất kỳ điều gì khác. Đánh chúng tôi trong phần bình luận hoặc trên Twitter @oktadev

Ví dụ xác thực PHP
Aaron Parecki

Aaron Parecki là Kiến trúc sư bảo mật cao cấp tại Okta. Ông là tác giả của OAuth 2. 0 Đơn giản hóa và duy trì oauth. bọc lưới. Anh ấy thường xuyên viết và nói chuyện về OAuth và bảo mật trực tuyến. Anh ấy là biên tập viên của một số thông số kỹ thuật internet và là người đồng sáng lập IndieWebCamp, một hội nghị tập trung vào quyền sở hữu dữ liệu và danh tính trực tuyến. Aaron đã phát biểu tại các hội nghị trên khắp thế giới về OAuth, quyền sở hữu dữ liệu, bản thân được định lượng và tự động hóa gia đình, đồng thời tác phẩm của anh ấy đã được giới thiệu trên Wired, Fast Company, v.v.

Làm cách nào để xác thực trong PHP?

Bước 1- Tạo biểu mẫu đăng nhập HTML PHP. Để tạo một biểu mẫu đăng nhập, hãy làm theo các bước được đề cập bên dưới. .
Bước 2. Tạo mã CSS cho thiết kế trang web. .
Bước 3. Tạo bảng cơ sở dữ liệu bằng MySQL. .
Bước 4. Mở kết nối đến cơ sở dữ liệu MySQL. .
Bước 5 - Tạo phiên đăng xuất. .
Bước 6 - Tạo Mã cho Trang chủ

Làm cách nào để xác thực bằng PHP và MySQL?

Có một vài bước được đưa ra bên dưới để thiết lập môi trường. .
Mở Bảng điều khiển XAMPP
Khởi động máy chủ Apache bằng cách nhấp vào nút Bắt đầu
Khởi động MySQL bằng cách nhấp vào nút Bắt đầu
Tạo tất cả các tệp cần thiết để đăng nhập
Tạo bảng đăng nhập vào cơ sở dữ liệu bằng phpMyAdmin trong XAMPP

Làm cách nào để đăng nhập an toàn trong PHP?

Bắt đầu. Có một số bước chúng tôi cần thực hiện trước khi tạo hệ thống đăng nhập an toàn của mình. .
Tạo thiết kế biểu mẫu đăng nhập. .
Tạo cơ sở dữ liệu và thiết lập bảng. .
Xác thực người dùng bằng PHP. .
Tạo Trang chủ. .
Tạo trang hồ sơ. .
Tạo tập lệnh đăng xuất

Làm cách nào tôi có thể nhận được xác thực cơ bản trong PHP?

$_SERVER["REMOTE_USER"] - CGI tiêu chuẩn . $_SERVER["PHP_AUTH_USER"] - APACHE . $_SERVER["AUTH_USER"] - IIS .