การ authorize user ด้วย php มีหลายวิธีครับ วันนี้เราจะมาดูการ HTTP Authenticate ด้วย PHP กันครับ
ตามมาตรฐาน HTTP แล้วเมื่อต้องการให้มีการแสดง dialog เพื่อ login นั้นจะต้องมีการส่ง header WWW-Authenticate ไปยัง browser
โดยการ Autheticate ด้วย HTTP authenticate นี้จะมี 2 แบบคือ
การส่ง header ไปยัง client ก็ใช้ header() นี่ล่ะครับ เช่น header("WWW-Authenticate :Basic realm=\"secure access\"");
โดยค่าของ realm จะต้องมีการส่งค่า realm ไปยัง client ทั้งแบบ basic และ digest ความหมายของ realm คือเป็นตัวบ่งบอกส่วนที่ต้องการทำ authenticate เท่านั้น (จะตั้งเป็นชื่ออะไรก็ได้ครับ ตามต้องการ) โดย browser จะนำไปแสดงผลใน login dialog ด้วยครับ
หลังจากส่ง header ไปยัง client แล้ว browser จะทำการแสดง login dialog เพื่อให้ user กรอก username และ password เพื่อทำการล็อกอิน เมื่อ user พิมพ์ username และ password แล้วกด ok เพื่อทำการ login แล้ว browser จะทำการส่งค่า username และ password (ที่ถูกเข้ารหัสแล้ว) ไปยัง server โดย PHP จะได้รับค่าตัวแปรเหล่านี้มาเก็บไว้ในตัวแปร $_SERVER["PHP_AUTH_USER"] และ $_SERVER["PHP_AUTH_PW"] โดยเก็บ username และ password ตามลำดับ
โดยเราจะนำตัวแปร 2 ตัวนี้มาใช้ในการ authorize user กันครับ
ตัวอย่างการใช้งาน HTTP Authenticate + PHP + MySql
<?
if(isset($_SERVER["PHP_AUTH_USER"]) && isset($_SERVER["PHP_AUTH_PW"])){
$link = @mysql_connect("localhost","root","pass");
@mysql_select_db("db_name", $link);
$res = @mysql_query("SELECT id FROM user_table WHERE username='".$_SERVER["PHP_AUTH_USER"]."' AND password='".$_SERVER["PHP_AUTH_PW"]."' LIMIT 1", $link);
if(@mysql_num_rows($res) == 1){
//Authorize OK
}else{
//Authorize failed
}
@mysql_free_result($res);
@mysql_close($link);
}else{
header("WWW-Authenticate :Basic realm=\"secure access\"");
echo "Restriction area, authorized require.";
//แสดงผลเมื่อไม่มีการ authorized
exit;
}
?>
เป็นเพียงตัวอย่างโค๊ดเท่านั้นนะครับ ลองเอาไปประยุกต์ใช้ดูครับ
ตามมาตรฐาน HTTP แล้วเมื่อต้องการให้มีการแสดง dialog เพื่อ login นั้นจะต้องมีการส่ง header WWW-Authenticate ไปยัง browser
โดยการ Autheticate ด้วย HTTP authenticate นี้จะมี 2 แบบคือ
- Digest เป็นการ Authenticate โดยมีการส่ง username : password ไปยัง server โดยไม่มีการเข้ารหัส (unencrypted)
- Basic เป็นการ Authenticate โดยมีการส่ง username : password ไปยัง server โดยมีการเข้ารหัส (encrypted)
การส่ง header ไปยัง client ก็ใช้ header() นี่ล่ะครับ เช่น header("WWW-Authenticate :Basic realm=\"secure access\"");
โดยค่าของ realm จะต้องมีการส่งค่า realm ไปยัง client ทั้งแบบ basic และ digest ความหมายของ realm คือเป็นตัวบ่งบอกส่วนที่ต้องการทำ authenticate เท่านั้น (จะตั้งเป็นชื่ออะไรก็ได้ครับ ตามต้องการ) โดย browser จะนำไปแสดงผลใน login dialog ด้วยครับ
หลังจากส่ง header ไปยัง client แล้ว browser จะทำการแสดง login dialog เพื่อให้ user กรอก username และ password เพื่อทำการล็อกอิน เมื่อ user พิมพ์ username และ password แล้วกด ok เพื่อทำการ login แล้ว browser จะทำการส่งค่า username และ password (ที่ถูกเข้ารหัสแล้ว) ไปยัง server โดย PHP จะได้รับค่าตัวแปรเหล่านี้มาเก็บไว้ในตัวแปร $_SERVER["PHP_AUTH_USER"] และ $_SERVER["PHP_AUTH_PW"] โดยเก็บ username และ password ตามลำดับ
โดยเราจะนำตัวแปร 2 ตัวนี้มาใช้ในการ authorize user กันครับ
ตัวอย่างการใช้งาน HTTP Authenticate + PHP + MySql
<?
if(isset($_SERVER["PHP_AUTH_USER"]) && isset($_SERVER["PHP_AUTH_PW"])){
$link = @mysql_connect("localhost","root","pass");
@mysql_select_db("db_name", $link);
$res = @mysql_query("SELECT id FROM user_table WHERE username='".$_SERVER["PHP_AUTH_USER"]."' AND password='".$_SERVER["PHP_AUTH_PW"]."' LIMIT 1", $link);
if(@mysql_num_rows($res) == 1){
//Authorize OK
}else{
//Authorize failed
}
@mysql_free_result($res);
@mysql_close($link);
}else{
header("WWW-Authenticate :Basic realm=\"secure access\"");
echo "Restriction area, authorized require.";
//แสดงผลเมื่อไม่มีการ authorized
exit;
}
?>
เป็นเพียงตัวอย่างโค๊ดเท่านั้นนะครับ ลองเอาไปประยุกต์ใช้ดูครับ

















