<?php $app = new \Slim\Slim(); $app->get('/books/:id', function ($id) { //Show book identified by $id });
<?php $app = new \Slim\Slim(); $app->map('/foo/bar', function() { echo "I respond to multiple HTTP methods!"; })->via('GET', 'POST'); $app->run();
<?php $app = new \Slim\Slim(); $app->map('/hello', function() { echo "Hello"; })->via('FOO'); $app->run();
요즘 API개발이 한창이다
많이들 사용하는 방식이 헤더에 Authorization 항목을 넣어서 인증하는 방법이다.
사용자는 해더에 아래와 같이 전송한다.
Authorization: Basic 인증코드
인증코드는 아이디와 패스워드를 :로 구분하여 base64로 인코딩후 넣는다.
Authorization: Basic bWl5dTpkbHN3bGR 이런식?
base64_encode("id:pass") 이렇게 인코딩하면 된다.
그럼 서버쪽에서는?
_SERVER["HTTP_AUTHORIZATION"] : Basic bWl5dTpkbHN3bGR
_SERVER["PHP_AUTH_USER"] : id (자동으로 디코딩 된다)
_SERVER["PHP_AUTH_PW"] : pass (자동으로 디코딩 된다)
이렇게 사용할수 있다.
한차원 높은 보안을 원한다면
base64인코딩 하기전에 token을 사용하여 openssl으로 한번 감싸서 보내도록하자
특정키로 암호화 (AES-256)
base64_encode(openssl_encrypt("id:pass", "aes-256-cbc", $key, true, str_repeat(chr(0), 16)));
복호화
openssl_decrypt(base64_decode("isZXs9diEm43k6uRBtJJRQ=="), "aes-256-cbc", $key, true, str_repeat(chr(0), 16));
function verify_market_in_app($signed_data, $signature, $public_key_base64) { $key = "-----BEGIN PUBLIC KEY-----\n". chunk_split($public_key_base64, 64,"\n"). '-----END PUBLIC KEY-----'; //using PHP to create an RSA key $key = openssl_get_publickey($key); //$signature should be in binary format, but it comes as BASE64. //So, I'll convert it. $signature = base64_decode($signature); //using PHP's native support to verify the signature $result = openssl_verify( $signed_data, $signature, $key, OPENSSL_ALGO_SHA1); if (0 === $result) { return false; } else if (1 !== $result) { return false; } else { return true; } }
function verify_app_store_in_app($receipt, $is_sandbox) { //$sandbox should be TRUE if you want to test against itunes sandbox servers if ($is_sandbox) $verify_host = "ssl://sandbox.itunes.apple.com"; else $verify_host = "ssl://buy.itunes.apple.com"; $json='{"receipt-data" : "'.$receipt.' }'; //opening socket to itunes $fp = fsockopen ($verify_host, 443, $errno, $errstr, 30); if (!$fp) { // HTTP ERROR return false; } else { //iTune's request url is /verifyReceipt $header = "POST /verifyReceipt HTTP/1.0\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($json) . "\r\n\r\n"; fputs ($fp, $header . $json); $res = ''; while (!feof($fp)) { $step_res = fgets ($fp, 1024); $res = $res . $step_res; } fclose ($fp); //taking the JSON response $json_source = substr($res, stripos($res, "\r\n\r\n{") + 4); //decoding $app_store_response_map = json_decode($json_source); $app_store_response_status = $app_store_response_map->{'status'}; if ($app_store_response_status == 0)//eithr OK or expired and needs to synch { //here are some fields from the json, btw. $json_receipt = $app_store_response_map->{'receipt'}; $transaction_id = $json_receipt->{'transaction_id'}; $original_transaction_id = $json_receipt->{'original_transaction_id'}; $json_latest_receipt = $app_store_response_map->{'latest_receipt_info'}; return true; } else { return false; } } }
Status Code |
Description |
---|---|
21000 |
The App Store could not read the JSON object you provided. |
21002 |
The data in the receipt-data property was malformed. |
21003 |
The receipt could not be authenticated. |
21004 |
The shared secret you provided does not match the shared secret on file for your account. |
21005 |
The receipt server is not currently available. |
21006 |
This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response. |
21007 |
This receipt is a sandbox receipt, but it was sent to the production service for verification. |
21008 |
This receipt is a production receipt, but it was sent to the sandbox service for verification. |
상태 코드 |
기술 |
---|---|
21000 |
앱 스토어가 제공 한 JSON 객체를 읽을 수 없습니다. |
21002 |
수신 데이터 속성의 데이터 형식이 잘못되었습니다. |
21003 |
영수증 인증 할 수 없습니다. |
21004 |
당신이 제공하는 공유 비밀은 귀하의 계정에 대한 파일의 공유 비밀과 일치하지 않습니다. |
21005 |
수신 서버는 현재 사용할 수 없습니다. |
21006 |
이 영수증은 유효하지만 구독이 만료되었습니다. 이 상태 코드는 서버에 반환 될 때, 수신 데이터는 디코딩과 응답의 일부로 반환됩니다. |
21007 |
이 영수증은 샌드 박스 영수증이지만 확인을 위해 생산 서비스로 전송되었습니다. |
21008 |
이 영수증은 제품 수령이지만 확인을 위해 샌드 박스 서비스로 전송되었습니다. |
윈도우에서 개발을 하는데 nginx apache가 안뜬다.
이미 80포트를 사용하고 있다는 메세지가....
찾아보니 skype가 이미 80포트를 점유하고 있었다.
어째 skype는 80포트를 잡아먹고 있는가...쩝...
skype죽이고 띄웠더니 오케이..
이번 프로젝트는 100% restful API 이기때문에 기존에 사용하던 CI에서 우리나라에서 매우 생소한
SLIM Framework(http://www.slimframework.com)을 사용하기로 했다.
이런류를 마이크로 프레임워크라고 하는데 그중에 SLIM이 restful 지원이 원할하고 속도도 매우 빠르다.
다만...기능이 CI처럼 많진 않다. 뭐 마이크로니까...
http://systemsarchitect.net/performance-benchmark-of-popular-php-frameworks/
근데 CI보다 빠르다던 라라벨이 어째서...
NGINX와 같이 사용하는데 기존 CI 설정대로 하면 $_GET에서 문제가 생긴다.
$_GET 첫번째에 무조건 /v1/aaa/bbb 풀경로가 들어가있다.
이걸 해결하기 위해서는
try_files $uri $uri/ /index.php?$query_string;
이렇게 뒤에 $query_string 으로 해주면 된다.
글록등을 끼워서 사용할수 있는 컨버전킷인 일명 로니킷과 APS Action Combat 를 비교해본다
일단 로니킷과 APS의 가격차는 로니킷이 2배정도 비싸다
전동글록에 쓸 생각으로 로니킷을 글록용인줄고 샀는데 P226용이였다
그래서 APS를 다시 구입하게 된것인데 P226용은 국내에서 인기가 없다ㅠㅜ (따발이 없어서?)
무게나 퀄리티 모두 로니킷이 우세하고 스위벨이 없고 레일이 알미늄이고 스페아탄창을 하나 더 끼울수 있다
견착 포지젼도 좋다.
APS는 레일이 플라스틱이고 스위벨이 있으며 스페아탄창 끼울수 있는곳이 없다.
전체적으로 그냥 게임용으로 보면 되겠다.
길이와 무게는 로니킷이 좀더 크고 무겁다.
재질은 두 모델 모두 나이론 화이버.
아참..로니킷은 영화 베를린에서도 나왔다
PHP_EOL (string)
The correct 'End Of Line' symbol for this platform. Available since PHP 4.3.10 and PHP 5.0.2(PHP 4 >= 4.0.1, PHP 5)
str_pad — 문자열을 지정한 길이가 되도록 다른 문자열로 채웁니다
string str_pad ( string $input , int $pad_length [, string $pad_string [, int $pad_type ]] )
<?php
$input = "Alien";
echo str_pad($input, 10); // "Alien "을 생성.
echo str_pad($input, 10, "-=", STR_PAD_LEFT); // "-=-=-Alien"을 생성.
echo str_pad($input, 10, "_", STR_PAD_BOTH); // "__Alien___"을 생성.
echo str_pad($input, 6 , "___"); // "Alien_"을 생성.
?>
(PHP 4 >= 4.0.5, PHP 5)
iconv — Convert string to requested character encoding
string iconv ( string $in_charset , string $out_charset , string $str )
<?php
$text = "안녕";
echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "EUC-KR//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE : ', iconv("UTF-8", "EUC-KR//IGNORE", $text), PHP_EOL;
echo 'Plain : ', iconv("UTF-8", "EUC-KR", $text), PHP_EOL;
echo 'Plain : ', iconv("EUC-KR", "UTF-8", $text), PHP_EOL;
?>
* notice에러 방지
$ret = $arr[var];
-> $ret = $arr['var'];
* notice에러 방지
if ($_POST['var'])
-> if (isset($_POST['var']))
* 남용하면 이해할수 없는 코드가 됨
isset($_POST['var'])? $_POST['var']:NULL;
-> 삼항연산자는 남용하지 않는다.
* 무한루프 방지
for($i=0; $i<$max; $i++) {
-> for($i=0, $max = count($loop); $i<$max; $i++) {
* 메모리 절약
$msg = '안녕하세요';
echo $msg;
-> echo '안녕하세요';
* 에러 방지
echo "안녕 $msg";
-> echo '안녕 '.$msg;
foreach가 빠르다
explode가 빠르다
모든 변수는 선언하지 않은채 사용하면 notice에러가 발생한다.