Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pembangunan PHP: Cara menggunakan JWT untuk pengesahan dan kebenaran

Pembangunan PHP: Cara menggunakan JWT untuk pengesahan dan kebenaran

王林
王林asal
2023-06-14 16:14:511815semak imbas

Dalam pembangunan aplikasi web moden, keselamatan telah menjadi bahagian penting. Pengesahan dan kebenaran adalah penting dalam hal ini, kerana ia memastikan bahawa hanya pengguna yang dibenarkan boleh mengakses sumber yang dilindungi. Terdapat banyak mekanisme pengesahan dan kebenaran tersedia, yang mana JWT (JSON Web Token) merupakan mekanisme yang sangat popular kerana ia mudah, fleksibel, berskala dan selamat. Dalam artikel ini, kami akan meneroka cara menggunakan PHP dan JWT untuk pengesahan dan kebenaran.

Bahagian Pertama: Asas JWT

JSON Web Token (JWT) ialah standard terbuka untuk menghantar maklumat tuntutan dan pengesahan melalui web dengan selamat. Ia terdiri daripada tiga bahagian: pengepala, muatan dan tandatangan.

Pengepala mengandungi maklumat jenis algoritma dan token. Contohnya mungkin kelihatan seperti ini:

{
  "alg": "HS256",
  "typ": "JWT"
}

Muatan muatan mengandungi maklumat yang perlu dihantar. Contohnya, nama pengguna, peranan dan maklumat lain tentang pengguna. Contoh muatan mungkin kelihatan seperti ini:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Tandatangan ialah rentetan yang disulitkan yang mengandungi kunci yang digunakan untuk mengesahkan bahawa JWT adalah sah. Contoh tandatangan mungkin kelihatan seperti ini:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(claims),
  secret)

Bahagian 2: Melaksanakan JWT menggunakan PHP

Untuk menggunakan JWT untuk pengesahan dan kebenaran, kami memerlukan kelas PHP untuk menjana dan mengesahkan JWT. Mari kita lihat pelaksanaan kelas PHP JWT yang mudah.

<?php

class JWT {
  private $header;
  private $payload;
  private $secret;

  public function __construct($header, $payload, $secret) {
    $this->header = $header;
    $this->payload = $payload;
    $this->secret = $secret;
  }

  public function encode() {
    $header = $this->base64UrlEncode(json_encode($this->header));
    $payload = $this->base64UrlEncode(json_encode($this->payload));
    $signature = $this->base64UrlEncode(hash_hmac('sha256', $header . '.' . $payload, $this->secret, true));
    return $header . '.' . $payload . '.' . $signature;
  }

  public function decode($jwt) {
    $parts = explode('.', $jwt);
    $header = json_decode($this->base64UrlDecode($parts[0]), true);
    $payload = json_decode($this->base64UrlDecode($parts[1]), true);
    $signature = $this->base64UrlDecode($parts[2]);
    $result = hash_hmac('sha256', $parts[0] . '.' . $parts[1], $this->secret, true);
    if (hash_equals($result, $signature)) {
      return $payload;
    } else {
      return null;
    }
  }

  private function base64UrlEncode($data) {
    return rtrim(strtr(base64_encode($data), '+/', '-_'), '=');
  }

  private function base64UrlDecode($data) {
    return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
  }
}

Dalam kelas PHP ini, $header, $payload dan $secret menyimpan pengepala JWT, muatan dan maklumat utama. Kaedah encode() menggunakan header, payload dan secret untuk menjana rentetan JWT. Kaedah decode() menggunakan rentetan dan kunci JWT yang diberikan untuk mendapatkan maklumat muatan. Kaedah

base64UrlEncode() dan base64UrlDecode() digunakan untuk mengekod dan menyahkod pengepala dan muatan JWT.

Bahagian Tiga: Menggunakan JWT untuk Pengesahan dan Kebenaran

Kini, kami telah memahami asas JWT dan mempunyai kelas PHP JWT untuk menjana dan mengesahkan JWT. Jadi, bagaimana kita menggunakan JWT untuk pengesahan dan kebenaran?

Pertama, apabila pengguna log masuk, token boleh dihantar menggunakan JWT untuk mengesahkan identiti mereka. Pelayan akan menjana JWT dengan muatan nama pengguna dan kata laluan dan menghantarnya kepada pelanggan. Pelanggan akan menghantar token ini sebagai skim pengesahan Pembawa dalam pengepala Kebenaran pada setiap permintaan. Pelayan akan mengekstrak JWT daripada pengepala dan mengesahkan kesahihannya jika perlu.

Berikut ialah contoh pelaksanaan JWT untuk pengesahan dan kebenaran:

<?php

// 使用 JWT 登录
function login($username, $password) {
  // 检查用户名和密码是否正确
  $is_valid = validate_user_credentials($username, $password);
  if (!$is_valid) {
    return null;
  }

  // 生成 JWT
  $header = array('alg' => 'HS256', 'typ' => 'JWT');
  $payload = array('sub' => $username);
  $jwt = new JWT($header, $payload, $GLOBALS['secret']);
  $token = $jwt->encode();

  // 返回 JWT
  return $token;
}

// 验证 JWT
function validate_token($jwt) {
  $jwt = new JWT($header, $payload, $GLOBALS['secret']);
  $payload = $jwt->decode($jwt);
  if ($payload == null) {
    return false;
  }

  // 验证成功
  return true;
}

// 保护资源
function protect_resource() {
  // 检查 JWT 是否有效
  $jwt = get_authorization_header();
  if (!validate_token($jwt)) {
    http_response_code(401);
    exit();
  }

  // 资源保护
  // ...
}

// 从标头获取 JWT
function get_authorization_header() {
  $headers = getallheaders();
  if (isset($headers['Authorization'])) {
    return $headers['Authorization'];
  }
  return null;
}

// 检查用户名和密码是否正确
function validate_user_credentials($username, $password) {
  // 验证用户名和密码
  // ...
  return true;
}

// 密钥
$GLOBALS['secret'] = "my-secret";

// 登录并获取 JWT
$token = login("username", "password");

// 将 JWT 添加到标头
$headers = array('Authorization: Bearer ' . $token);

// 保护资源
protect_resource($headers);

Dalam contoh ini, kaedah login() mencipta JWT menggunakan kelas JWT dan mengembalikannya untuk kegunaan pelanggan . Kaedah validate_token() boleh mengesahkan kesahihan JWT. Jika JWT tidak sah, palsu akan dikembalikan. Kaedah

get_authorization_header() mengekstrak JWT daripada pengepala permintaan. Kaedah protect_resource() digunakan untuk melindungi sumber web. Jika JWT tidak sah, fungsi ini akan menimbulkan ralat 401.

Akhir sekali, kunci ditakrifkan dalam skop global, $GLOBALS ['secret'] , yang sepatutnya menjadi rentetan yang panjang. Sila ambil perhatian bahawa kata laluan ini adalah kata laluan rahsia dan tidak boleh dimasukkan dalam pangkalan kod anda. Biasanya, kunci ini disimpan dalam pembolehubah persekitaran dan diuruskan oleh sistem pengendalian yang menjalankan pelayan web.

Kesimpulan

JWT ialah mekanisme yang sangat mudah, fleksibel, berskala dan selamat yang boleh digunakan untuk pengesahan dan kebenaran dalam aplikasi web. Dalam artikel ini, kami telah melihat asas JWT dan melihat contoh kelas PHP untuk menjana dan mengesahkan JWT. Kami juga melihat cara JWT boleh digunakan untuk pengesahan dan kebenaran. Kini anda boleh mencuba JWT dalam aplikasi web anda untuk memastikan apl anda lebih selamat.

Atas ialah kandungan terperinci Pembangunan PHP: Cara menggunakan JWT untuk pengesahan dan kebenaran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn