"PHP로 Digest 인증 구현"의 두 판 사이의 차이

잔글 (봇: 자동으로 텍스트 교체 (-source +syntaxhighlight))
 
(사용자 2명의 중간 판 9개는 보이지 않습니다)
1번째 줄: 1번째 줄:
==개요==
;PHP로 Digest 인증 구현
;PHP로 Digest 인증 구현
;PHP HTTP Digest 인증 구현
;PHP HTTP Digest authentication 구현
* 순수 PHP로 구현한 다이제스트 인증


==소스==
==소스==
<source lang='php'>
<syntaxhighlight lang='php'>
<?php
<?php
function http_digest_parse($txt) {
function http_digest_parse($txt) {
16번째 줄: 18번째 줄:
}
}
function is_auth() {
function is_auth() {
$users = array('admin'=>'mypass', 'guest'=>'guest');
$users = array('jmnote'=>'P@ssw0rd', 'guest'=>'guest');
if(empty($_SERVER['PHP_AUTH_DIGEST']))return false; // 오류
if(empty($_SERVER['PHP_AUTH_DIGEST']))return false; // 오류
$data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST']);
$data = http_digest_parse($_SERVER['PHP_AUTH_DIGEST']);
39번째 줄: 41번째 줄:
echo '<meta charset="utf-8">';
echo '<meta charset="utf-8">';
echo "$username 님 반갑습니다.";
echo "$username 님 반갑습니다.";
?>
</syntaxhighlight>
</source>
:→ jmnote // P@ssw0rd 또는 guest // guest 로 로그인 가능.
:→ jmnote // P@ssw0rd 또는 guest // guest 로 로그인 가능.
*예시: http://jmnote.com/php/auth_digest.php
*예시: http://zetawiki.com/ex/php/auth_digest.php


==같이 보기==
==같이 보기==
*[[HTTP Digest 인증]]
*[[HTTP Digest 인증]]
*[[PHP로 기본 인증 구현]]
*[[PHP로 기본 인증 구현]]
*[[PHP로 Digest 인증 통과하여 웹페이지 내용 읽기]]


==참고 자료==
==참고==
*http://php.net/manual/kr/features.http-auth.php
*http://php.net/manual/kr/features.http-auth.php
*http://en.wikipedia.org/wiki/Digest_access_authentication
*http://en.wikipedia.org/wiki/Digest_access_authentication


[[분류: PHP]]
[[분류: PHP]]
[[분류: 인증]]

2020년 11월 2일 (월) 02:35 기준 최신판

1 개요[ | ]

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

2 소스[ | ]

<?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 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}