PHP로 Digest 인증 구현

(PHP로 다이제스트 인증 구현에서 넘어옴)

1 개요[ | ]

PHP로 Digest 인증 구현
PHP HTTP Digest authentication 구현
  • 순수 PHP로 구현한 다이제스트 인증

2 소스[ | ]

PHP
Copy
<?php
function http_digest_parse($txt) {
	$needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
	$data = array();
	preg_match_all('@(\w+)=(?:(?:\'([^\']+)\'|"([^"]+)")|([^\s,]+))@', $txt, $matches, PREG_SET_ORDER);
	foreach ($matches as $m) {
		$data[$m[1]] = $m[2]?$m[2]:($m[3]?$m[3]:$m[4]);
		unset($needed_parts[$m[1]]);
	}
	return $needed_parts ? false : $data;
}
function is_auth() {
	$users = array('jmnote'=>'P@ssw0rd', 'guest'=>'guest');
	if(empty($_SERVER['PHP_AUTH_DIGEST']))return false; // 오류
	$data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST']);
	if($data === false)return false; // 오류
	global $username;
	$username = $data['username'];
	if(!isset($users[$username])) return false; // 아이디 틀림
	$ha1 = md5($username.':'.$data['realm'].':'.$users[$username]);
	$ha2 = md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
	$response = md5($ha1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$ha2);
	if($data['response'] != $response) return false; // 패스워드 틀림
	return true;
}
if( !is_auth() ) {
	$realm = 'Digest Auth Test';
	header('HTTP/1.1 401 Unauthorized');
	header('WWW-Authenticate: Digest realm="'.$realm.'",qop="auth",nonce="'.uniqid().'",opaque="'.md5($realm).'"');
	echo '<meta charset="utf-8">';
	echo '로그인이 필요합니다.';
	exit;
}
echo '<meta charset="utf-8">';
echo "$username 님 반갑습니다.";
→ jmnote // P@ssw0rd 또는 guest // guest 로 로그인 가능.

3 같이 보기[ | ]

4 참고[ | ]

  • PHP 파일 다운로드 구현 2 (한글 파일명 지원)
    제가 파일다운로드 관련된 것이 서툴러서 파일 다운로드 부분을 인용하였습니다. 죄송합니다.
  • PHP에서 오라클 DB 사용
    감사합니당. YoWu
  • PHP 파일 업로드 구현
    파일정보 출력에서 $name $ext 가 정상적으로 출력되나요? 전부 echo의 쌍따옴표안에 있는데? 일리단사오육칠
  • PHP 파일 업로드 구현
    PHP echo에서 쌍따옴표 안의 변수는 해석되어 출력됩니다. 위 소스에서도 $name와 $ext가 두껍게 나와있죠? 일반 문자열과는 다르다는 표시죠.J Jmnote
  • PHP 파일 다운로드 구현 2 (한글 파일명 지원)
    'Windows NT 6.1' << 이부분은 접속한 윈도우의 플랫폼을 뜻하는걸로 압니다. ie11 접속하면 다음과 같이 바뀌었고 Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko rv:11.0 << 이부분이 Anmkst
  • Lib my.php
    Fatal error: Uncaught Error: Call to undefined function insert_rows() in D:\xampp\htdocs\naru\import_excel.php:38 Stack trace: #0 {main} thrown in D:\xampp\htdo 신정섭
  • Lib my.php
    함수 query()를 사용하면 됩니다. 예시 추가했으니 참고바랍니다.J Jmnote
  • 로또번호 생성
    초보를 위한 개발 실습 과제로군요 ㅎㅎ Pinkcrimson