Lompat ke konten Lompat ke sidebar Lompat ke footer

Bagaimana Cara Autentikasi Dengan PHP? Simak Cara Berikut

 Autentikasi Dengan PHP

Autentikasi Dengan PHP


Anda dapat menggunakan fungsi header() untuk mengirim pesan "Authentication Required" ke browser klien sehingga akan muncul jendela input Username/Password. Setelah pengguna mengisi username dan password, URL yang berisi skrip PHP akan dipanggil lagi dengan variabel PHP_AUTH_USER, PHP_AUTH_PW, dan AUTH_TYPE yang telah ditentukan diatur sebagai nama pengguna, kata sandi, dan jenis otentikasi masing-masing. Variabel yang telah ditentukan ini dapat ditemukan di dalam array $_SERVER. Hanya metode otentikasi "Basic" dan "Digest" yang didukung. Lihat fungsi header() untuk informasi lebih lanjut.

Berikut adalah contoh fragmen skrip yang akan memaksa otentikasi klien pada sebuah halaman:

<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo
'Text to send if user hits Cancel button';
exit;
} else {
echo
"<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo
"<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>

Pastikan bahwa Anda telah menggunakan HTTP AUTHORIZATION header dan variabel-variabel yang terkait dengan otentikasi HTTP telah diatur sebelum memproses data otentikasi di dalam skrip PHP.

Contoh kedua ini menunjukkan bagaimana Anda dapat mengimplementasikan skrip otentikasi HTTP Digest yang sederhana.

<?php
$realm
= 'Restricted area';

//user => password
$users = array('admin' => 'mypass', 'guest' => 'guest');


if (empty(
$_SERVER['PHP_AUTH_DIGEST'])) {
header('HTTP/1.1 401 Unauthorized');
header('WWW-Authenticate: Digest realm="'.$realm.
'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');

die(
'Text to send if user hits Cancel button');
}


// analyze the PHP_AUTH_DIGEST variable
if (!($data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST'])) ||
!isset(
$users[$data['username']]))
die(
'Wrong Credentials!');


// generate the valid response
$A1 = md5($data['username'] . ':' . $realm . ':' . $users[$data['username']]);
$A2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
$valid_response = md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);

if (
$data['response'] != $valid_response)
die(
'Wrong Credentials!');

// ok, valid username & password
echo 'You are logged in as: ' . $data['username'];


// function to parse the http auth header
function http_digest_parse($txt)
{
// protect against missing data
$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
$data = array();
$keys = implode('|', array_keys($needed_parts));

preg_match_all('@(' . $keys . ')=(?:([\'"])([^\2]+?)\2|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);

foreach (
$matches as $m) {
$data[$m[1]] = $m[3] ? $m[3] : $m[4];
unset(
$needed_parts[$m[1]]);
}

return
$needed_parts ? false : $data;
}
?>
Catatan: Catatan Kompatibilitas
Harap berhati-hati saat menulis baris header HTTP. Untuk menjamin kompatibilitas maksimum dengan semua klien, kata kunci "Basic" harus ditulis dengan huruf besar "B", string realm harus diapit oleh tanda kutip ganda (bukan tunggal), dan tepat satu spasi harus mendahului kode 401 pada baris header HTTP/1.0 401. Parameter otentikasi harus dipisahkan oleh koma seperti yang terlihat pada contoh digest di atas.

Alih-alih hanya mencetak PHP_AUTH_USER dan PHP_AUTH_PW seperti pada contoh di atas, Anda mungkin perlu melakukan pengecekan validitas nama pengguna dan kata sandi dengan cara seperti mengirimkan permintaan ke database atau mencari pengguna dalam file dbm.

Anda harus berhati-hati terhadap browser Internet Explorer yang bermasalah karena browser tersebut sangat memilih urutan header. Untuk menghindari masalah tersebut, Anda dapat mengirimkan header WWW-Authenticate sebelum header HTTP/1.0 401.

Perlu diingat bahwa tindakan di atas tidak dapat mencegah seseorang yang mengontrol URL yang belum terotentikasi untuk mencuri kata sandi dari URL terotentikasi pada server yang sama.

Ketika server memberikan respons 401, baik Netscape Navigator maupun Internet Explorer akan menghapus cache autentikasi jendela browser lokal untuk realm. Hal ini dapat membuat pengguna keluar dan terpaksa memasukkan kembali nama pengguna dan kata sandi mereka. Beberapa orang menggunakan fitur ini untuk mengatur waktu habis login atau menyediakan tombol keluar.

Contoh 3 adalah contoh autentikasi HTTP yang memaksa pengguna untuk memasukkan nama pengguna dan kata sandi baru.

<?php
function authenticate() {
header('WWW-Authenticate: Basic realm="Test Authentication System"');
header('HTTP/1.0 401 Unauthorized');
echo
"You must enter a valid login ID and password to access this resource\n";
exit;
}

if (!isset(
$_SERVER['PHP_AUTH_USER']) ||
(
$_POST['SeenBefore'] == 1 && $_POST['OldAuth'] == $_SERVER['PHP_AUTH_USER'])) {
authenticate();
} else {
echo
"<p>Welcome: " . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "<br />";
echo
"Old: " . htmlspecialchars($_REQUEST['OldAuth']);
echo
"<form action='' method='post'>\n";
echo
"<input type='hidden' name='SeenBefore' value='1' />\n";
echo
"<input type='hidden' name='OldAuth' value=\"" . htmlspecialchars($_SERVER['PHP_AUTH_USER']) . "\" />\n";
echo
"<input type='submit' value='Re Authenticate' />\n";
echo
"</form></p>\n";
}
?>

Ini bukan perilaku yang diwajibkan oleh standar autentikasi dasar HTTP, sehingga tidak boleh diandalkan. Berdasarkan pengujian dengan Lynx, diketahui bahwa Lynx tidak menghapus kredensial autentikasi dengan respons server 401, sehingga pengguna masih dapat membuka sumber daya yang sama dengan menekan tombol "back" dan "forward" selama persyaratan kredensial tidak berubah. Namun, pengguna dapat menghapus informasi autentikasi mereka dengan menekan tombol '_' .

Untuk menggunakan Autentikasi HTTP pada server IIS dengan versi PHP CGI, Anda harus mengedit konfigurasi "Directory Security" pada IIS. Anda hanya perlu memilih opsi "Anonymous Access" dan kosongkan semua opsi lainnya.