개발 꿀팁/PHP

curl 또는 file_get_contents 인증 페이지를 가져오는 방법

Jammie 2022. 8. 24. 12:24
반응형

php curl 확장, 서버측 POST/GET 요청, 페이지 접근, 페이지 반환 데이터 획득이 가능합니다.

예를 들어 가져올 페이지: http://localhost/server.php

<?php
$content = isset($_POST['content'])? $_POST['content'] : '';
header('content-type:application/json');
echo json_encode(array('content'=>$content));
?>

curl을 사용하여 server.php 페이지 가져오기

<?php
$url = 'http://localhost/server.php';
$param = array('content'=>'fdipzone blog');
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ret = curl_exec($ch);
$retinfo = curl_getinfo($ch);
curl_close($ch);
 
if($retinfo['http_code']==200){
    $data = json_decode($ret, true);
    print_r($data);
}else{
    echo 'POST Fail';
}
?>

서비스에 php curl 확장 기능이 설치되어 있지 않으면 file_get_contents를 사용하여 요청, 페이지 반환 데이터 가져오기

<?php
$url = 'http://localhost/server.php';
$param = array('content'=>'fdipzone blog');
 
$opt = array(
    'http' => array(
        'method' => 'POST',
        'header' => 'content-type:application/x-www-form-urlencoded',
        'content' => http_build_query($param)
    )
);
 
$context = stream_context_create($opt);
 
$ret = file_get_contents($url, false, $context);
 
if($ret){
    $data = json_decode($ret, true);
    print_r($data);
}else{
    echo 'POST Fail';
}
?>

curl과 file_get_contents를 사용하여 반환된 결과는 동일합니다

Array
(
    [content] => fdipzone blog
)

권한이 필요한 페이지, 예를 들어 htpasswd+.htaccess를 사용하여 디렉토리 접근 권한을 설정한 페이지에는 위의 방법으로 401 Unauthorized 오류가 반환됩니다.
이번 예에서는 htpasswd+.htaccess를 사용하여 접근 권한을 제어하는 대신 $_SERVER['P_AUTH_USER']와 $_SERVER['P_AUTH_USER']를 사용합니다.'PH_AUTH_PW'] 이 두 서버 파라미터

HTTP: // localhost/ server.php를 다음과 같이 수정합니다

<?php
if(!isset($_SERVER['PHP_AUTH_USER'])) 
{ 
    header('WWW-Authenticate: Basic realm="localhost"'); 
    header("HTTP/1.0 401 Unauthorized"); 
    exit; 
}else{ 
    if (($_SERVER['PHP_AUTH_USER']!= "fdipzone" || $_SERVER['PHP_AUTH_PW']!="654321")) {
        header('WWW-Authenticate: Basic realm="localhost"');
        header("HTTP/1.0 401 Unauthorized");
        exit;
    }
}
 
$content = isset($_POST['content'])? $_POST['content'] : '';
header('content-type:application/json');
echo json_encode(array('content'=>$content));
?>

curl에는 CURLOPT_USERPWD라는 파라미터가 있습니다. 이 파라미터를 이용하여 계정 비밀번호를 요청 시 전송할 수 있습니다

curl_setopt($ch, CURLOPT_USERPWD, '계정: 비밀번호');

curl이 요청한 프로그램은 다음과 같이 수정되었습니다

<?php
$url = 'http://localhost/server.php';
$param = array('content'=>'fdipzone blog');
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, 'fdipzone:654321'); // 이 구절을 삽입하다
$ret = curl_exec($ch);
$retinfo = curl_getinfo($ch);
curl_close($ch);
 
if($retinfo['http_code']==200){
    $data = json_decode($ret, true);
    print_r($data);
}else{
    echo 'POST Fail';
}
?>

file_get_contents 계정과 비밀번호를 보내려면 header를 수동으로 연결해야 합니다.
file_get_contents에서 요청한 프로그램은 다음과 같이 수정되었습니다

<?php
$url = 'http://localhost/server.php';
$param = array('content'=>'fdipzone blog');
 
$auth = sprintf('Authorization: Basic %s', base64_encode('fdipzone:654321')); //이 구절을 삽입하다
 
$opt = array(
    'http' => array(
        'method' => 'POST',
        'header' => "content-type:application/x-www-form-urlencoded\r\n".$auth."\r\n", // $auth를 헤더에 넣다
        'content' => http_build_query($param)
    )
);
 
$context = stream_context_create($opt);
 
$ret = file_get_contents($url, false, $context);
 
if($ret){
    $data = json_decode($ret, true);
    print_r($data);
}else{
    echo 'POST Fail';
}
?>

 

반응형

'개발 꿀팁 > PHP' 카테고리의 다른 글

php 0~1 난수 생성 방법  (0) 2022.08.24
JSON 문자열 key에 큰따옴표가 없습니다  (0) 2022.08.24
php 문법 기술  (0) 2022.08.24
mongodb 위치 찾기  (0) 2022.08.24
php str_replace 지정한 횟수 바꾸기  (1) 2022.08.23