공공데이터 포털에서는 금융감독원에서 제공하는 주식시세의 OPEN API를 이용할 수 있습니다. 이 OPEN API를 이용해 시세를 정보를 얻어오는 샘플 코드를 만들어 보려고 합니다.

공공 데이터 포털에 접속 후 금융위원회에서 제공하는 주식시세 정보 aip 활용신청을 합니다.

 

그럼 아래와 같이 활용신청이 나고 사용가능한 상태가 됩니다. 페이지 내용에 들어 가면 간단히 api를 활용할 수 있는 상태가 됩니다.

 

REST API 이므로 아래와 같이 간단한 코드로 사용이 가능합니다. 주의할점은 http_build_query 가 자동으로 urlEncoding까지 하므로, 일반 인증키(decoding)을 사용하도록 합니다.

<?php

function get_search($serviceKey, $stdt){ // 상품검색명령

    $param = array(
        'serviceKey'=>$serviceKey,
        'stdt'=>$stdt
    );

    $url = "https://apis.data.go.kr/1160100/service/GetStockSecuritiesInfoService/getStockPriceInfo" . "?" . http_build_query($param);
    echo $url . PHP_EOL;
    $ch = curl_init();                                 //curl 초기화
    curl_setopt($ch, CURLOPT_URL, $url);               //URL 지정하기
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    //요청 결과를 문자열로 반환 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);      //connection timeout 10초 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   //원격 서버의 인증서가 유효한지 검사 안함
    
    $response = curl_exec($ch);
    curl_close($ch);
    
    return $response;

}

echo get_search([일반 인증키(Decoding)], "2023");

 

 

 

 

 

'PHP' 카테고리의 다른 글

PHP 8.2 업데이트  (0) 2023.01.02
php 정규식 문제점  (0) 2020.08.21
맥에서 php 활성화  (0) 2020.06.11
맥에서 php 활성화 및 컴포저 설치  (0) 2019.08.16
PHP Facebook OAuth 2.0 Login (fsocketopen 이용)  (0) 2019.06.17
Posted by 창업닉군
,

PHP 8.2 업데이트

PHP 2023. 1. 2. 02:07

최근 php 8.2가 업데이트 되어 글을 남깁니다. 

 

Readonly Classes

클래스를 선언할 때 readonly 키워드를 앞에 붙여 선언할 수 있게 되었습니다. readonly로 클래스를 선언하면, type을 꼭 지정해 프로퍼티를 선언해야 하며, static property를 선언할 수 없습니다.

<?php

// 8.2 버전부터는 AllowDynamicProperties 가 Deprecated 경고가 뜬다고 합니다.
#[AllowDynamicProperties]
readonly class Foo {
}

// Fatal error: Cannot apply #[AllowDynamicProperties] to readonly class Foo
?>


<?php
readonly class Foo
{
    public $bar;
}

// Fatal error: Readonly property Foo::$bar must have type
?>


<?php
readonly class Foo
{
    public static int $bar;
}

// Fatal error: Readonly class Foo cannot declare static properties
?>

 

DNF

DNF 유형을 사용하면 교집합과 합집합을 결합할 수 있습니다.

 

stand-alone type : null, false and true

null, false, true를 int 같은 타입으로 선언해 사용할 수 있습니다. 클래스의 멤버 변수로 지정할 수 있습니다.

 

New "Random" extension

Random 기능이 확장되었습니다.

 

Constants in traits

trait 에 상수 선언이 가능해졌습니다.

 

Deprecate dynamic properties

dynamic properties가 지원이 중단 되었습니다.

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

php 정규식 문제점

PHP 2020. 8. 21. 19:42

다른 사이트 보면, preg_match 메소드를 쓰면, 한글이 잘 검색되는 것 처럼 나옵니다.

하지만 가끔 웹호스팅을 받다보면, 안되는 곳이 있습니다. (사실 preg_match를 써서 한글 정규식 검사가 제대로 된 경우를 만난적이 없습니다. 저는.)

그래서, mb_ereg_match를 쓰는데, 한글 검사가 잘됩니다.

하지만, 처음 쓸때 오류를 마구 만났습니다. 이유는 preg_match 슬래쉬 사이에 정규식패턴을 넣어줘야 하고, mb_ereg_match는 입력하면 안되기 때문입니다. 각각 아래와 같이 입력해야 합니다.

if( !mb_ereg_match( "^[가-힣]{2,16}$", $nickname ) ) return "한글 2~16자로 입력해 주세요";

if( !preg_match( "/^[a-zA-Z0-9]{2,8}$/", $id ) ) return "영어, 숫자 조합으로 2~8자로 입력해 주세요.";

사실, php 매뉴얼에 나와있지만 같겠지라고 생각하다 오류를 만날수 있습니다. (제가 그랬습니다. ㅠ,.ㅜ)

 

Posted by 창업닉군
,

Swoole 설치

PHP/swoole 2020. 6. 12. 10:00

실행환경

ubuntu 18.0.4

 

공식 사이트들

php.net

 

PHP: Hypertext Preprocessor

The PHP development team announces the immediate availability of PHP 7.2.0 Release Candidate 1. This release is the first Release Candidate for 7.2.0. All users of PHP are encouraged to test this version carefully, and report any bugs and incompatibilities

www.php.net

https://www.swoole.co.uk/

 

PHP Coroutine Async programming framework | Swoole PHP

Compared with other async programming frameworks or softwares such as Nginx, Tornado, Node.js, Swoole has the built-in PHP coroutine and async support, multiple threads I/O modules. Developers can use sync or async, coroutine API to write the applications

www.swoole.co.uk

 

선행작업

apache + php 설치 https://nicgoon.tistory.com/258

 

우분투( ubuntu ) apache + php 설치

작업환경 제 작업환경은 mac의 parallels를 설치, ubuntu 가상 pc를 생성해 작업하였습니다. OS : ubuntu 18.04 참고문서 https://webnautes.tistory.com/1185 Ubuntu 18.04에 LAMP ( Apache2, MySQL , PHP 7) 설..

nicgoon.tistory.com

설치 공식 문서 https://www.swoole.co.uk/docs/get-started/installation

 

Get started | Swoole PHP

 

www.swoole.co.uk

 

설치

php-pear 설치

$ sudo apt-get update

$ sudo apt-get install php-pear

phpize 설치

$ sudo apt install php-dev

swoole 설치

$ sudo pecl install swoole

 

php.ini 수정

설치가 완료되면, php.ini 파일에 extension이 추가되었음을 설정하라는 메시지가 나옵니다.

수정할 곳은 2군데 입니다. 일반 웹실행환경을 위한 apache2와 콘솔실행을 위한 cli입니다. swoole은 대체로 쉘 커맨드에서 실행하므로, cli도 반드시 수정해야 합니다.

웹을 위한 php.ini 경로 : /etc/php/7.2/apache2/php.ini
cli를 위한 php.ini 경로 : /etc/php/7.2/cli/php.ini

저는 7.2를 설치해 7.2라는 서브 경로를 포함하지만, 버전에 따라 서브 경로가 틀릴 수 있습니다.
각 파일들을 열어 가장 exptension들이 있는 가장 아랫줄에, extension=swoole.so를 포함시켜 줍니다.

아파치를 재 실행해 적용해 줍니다.

$ sudo service apache2 restart

Posted by 창업닉군
,

맥에서 php 활성화

PHP 2020. 6. 11. 13:18

참고 사이트들.

http://labs.brandi.co.kr/2018/01/23/kwakjs.html

 

Mac을 처음 쓰는 개발자에게

Overview애플(Apple) 제품을 한 번도 써본 적이 없습니다. 3주 전, 입사하고 받은 맥북(MacBook Pro)이 첫 애플 제품이었죠. 사실 개발 업무를 하면서 ‘한 번쯤은 애플 제품을 써 봐야겠다’는 생각을 하

labs.brandi.co.kr

 

맥은 구입시 부터 아파치, php, mysql이 설치되어 있습니다. 그래서, 활성화만 시켜주면, 사용이 바로 가능합니다.

이페지는 제가 메모용으로 만들어 둔 것이므로, 위 참고 사이트를 이용하시면 좋겠습니다.

 

1. 아파치 설치정보 확인.

httpd -v

 

2. php 설치 버전 확인.

php -v

 

3. apache 재시작

apachectl start

 

4. 가상 호스트 설정.

    $ vi /etc/apache2/httpd.conf
Include /private/etc/apache2/extra/httpd-vhosts.conf <- 주석제거.

- vi /etc/apache2/extra/httpd-vhosts.conf

80 번 보트 기본으로 가상 호스틀 사용할 것임을 명시.
-> NameVirtualHost *:80

주요 필요 값들은 DocumentRoot, ServerName

 

 

 

 

'PHP' 카테고리의 다른 글

PHP 8.2 업데이트  (0) 2023.01.02
php 정규식 문제점  (0) 2020.08.21
맥에서 php 활성화 및 컴포저 설치  (0) 2019.08.16
PHP Facebook OAuth 2.0 Login (fsocketopen 이용)  (0) 2019.06.17
PHP 로 FCM 서버 만들기 (fsocketopen 이용)  (0) 2019.04.30
Posted by 창업닉군
,

맥에서는 php를 사용하기 위한 apache 설정이 자동으로 다 되어 있어 활성화만 한다면, 바로 사용이 가능합니다.

먼저 apache 와 php 의 버전을 확인해 보면 다음과 같습니다.

$ apachectl -v

그 다음 php 버전을 확인해 보면 다음과 같습니다.

$ php -v

아파치를 실행해 주면 php는 자동으로 활성화가 됩니다.

$ sudo apachectl start

 

crul 을 통해 컴포저를 설치해 줍니다.

$ curl -sS https://getcomposer.org/installer | sudo php -- --install-dir=/usr/local/bin/

 

손쉽게 사용하기 위해 symbolic link를 건다.

$ sudo ln -s /usr/local/bin/composer.phar /usr/local/bin/composer

 

자신이 사용할 php 폴더에 composer.json 객체를 만들고, 사용할 모듈을 적어 줍니다. name은 없어도 상관이 없습니다.

{
    "name": "lesstif/my-project", 
    "require": {
           "laravel/framework": "4.2.*",
           "kmd/logviewer": "1.2.*",
           "monolog/monolog": "1.11.*"
       }
   }

 

위와 같이 입력한 파일을 만들고 같은 폴더에서 아래와 같이 명령하면 해당 폴더 아래 vender폴더를 만들고 그곳에 설치 파일들을 설치하기 시작 합니다.

$ composer install

 

컴포저로 모듈을 설치한 후 일정 기간이 지난 후 최신 버전들로 업데이트 하려면, 해당 폴더에서 아래와 같이 명령어를 입력하면 됩니다.

composer update

 

php에서는 해당 폴더속의 모듈을 설치할 때 마다 일일이 가지고 올 필요가 없습니다. vendor 속 autoload.php 파일을 로드 하므로써 한 번에 끝이 나게 됩니다. 대체로 아래와 같이 한 줄 추가 하게됩니다.

require_once 'vendor/autoload.php';

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

페이스북 로그인을 사용할 일이 있어 제 티스토리를 둘러 봤는데, 없어서, 작업하며 남겨 둡니다.

 

[공식문서]

Manually Build a Login Flow : https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow .

 

[주요 사이트]

페이스북 개발자 센터 : https://developers.facebook.com/ .

 

 

1. 페이스북 개발자 센터 로그인 및 앱정보 확인.

먼저, 개발자 센터로가 로그인하고, 해당 앱을 선택합니다. (페이스북 앱이 아직 없다면, 생성해 주면됩니다.).

 

베이직 셋팅으로가 AppID와 App Secret을 확인하고 메모해 둡니다. 앱 시크릿은 show 버튼을 누르면 표시가 됩니다.

그리고, 개발 계정에서도 사용할 수 있도로 계발자를 몇 명 등록합니다.

 

그리고, 페이스북 로그인을 사용할 수 있도록 추가합니다.

 

그리고 플랫폼별 퀵스타트가 나오는데 우리는 웹에 해당 하지만, 매뉴얼로 직접 설치 할 것 이므로, 굳이 보시지 않으셔도 좋습니다.

 

중요한 것은 리디렉션 페이지를 지정하는 것 입니다. 페이스북 로그인 시 처음 아이디 페스워드를 입력하는 창을 띄울 때 리디렉션을 통해 띄웁니다. 그리고, 이 것이 성공하면 호출될 리디렉션 주소를 입력하면 됩니다.

 

2. 로그인 창 부르기.

공식문서 Manually Build a Login Flow를 보면 아래와 같이 입력하라고 되어 있습니다.

https://www.facebook.com/v3.3/dialog/oauth?
  client_id={app-id}
  &redirect_uri={redirect-uri}
  &state={state-param}

 

값을 만들어 웹브라우저에 바로 붙여 넣어도 되며, 지금은 php서버로 작업할 것이며, start.php 파일을 만들어 위 페이지로 리다이렉션 시키도록 하겠습니다. state값은 임의로 생성해 주면 되며, redirect-url 은 로그인 결과를 돌려 받을 url로 위에서 적어둔 주소와 일치해야 합니다. 몇 개를 추가할 수는 있지만, 리스트에 없는 값으로 redirect를 요청하면 오류가 납니다. app-id는 위에서 확인했을 것 입니다.

그럼 로그인 페이지를 요청하겠습니다. 로그인이 끝나고, 돌려받는 redirect-url은 http:// 부터 (또는 https://) 파일명까지 풀로 적어 줍니다. 아래 소스가 페이스북 로그인 창을 부르는 소스의 모두 입니다. (편의상 start.php 라 하겠습니다.)

<?php

// 페이스북 로그인을 위한 주소를 만들어 줍니다.
$facebook_call_dialogue = "https://www.facebook.com/v3.3/dialog/oauth?"
  . "client_id={app-id}"
  . "&redirect_uri={redirect-uri}"
  . "&state={state-param}"
  ;
  
  
  
// 지정한 주소로 리디렉션 시키기.
header( 'Location: ' . $facebook_call_dialogue );

 

정상 동작한다면 아래와 같은 페이지를 만나게 됩니다.

 

페이스북의 API는 에세스 토큰을 얻은 다음 유저의 정보를 검색 하거나, 해당 유저 명의로 글을 쓰거나 할 수 있습니다.  이 때 권한이 필요한 데, 유저에게 이 앱이 그렇게 할 수 있는 권한을 주겠니 라고 물어보며, 그 화면이 아래와 같이 뜹니다.

 

여기서 다음을 누르면 code와 state를 위에서 적었던 redirect-url 페이지로 돌려 줍니다. 여기서 받은 코드를 서버에서 에세스 코드로 변경하는데, 보안상 php 서버에서 facebook과의 통신으로 통해 교환하며, GET 방식으로 연결해 받아 옵니다. php에서는 fsocketopen을 이용해 받아 올 수 있습니다.

 

 

 

3. 리디렉션 처리 하기.

리디렉션 까지 무사히 마쳤다면, GET을 통해 서버로 code 값이 전해 졌을 것 입니다. 그럼 아래 코드를 통해 토큰으로 교환할 수 있습니다. 이 부분은 redirect.php 에서 처리를 하면됩니다.

    // 코드값을 가지고 옵니다.
    $code = @$_GET['code'];



    // 에세스 토큰 교환을 위한 api 주소를 가지고 옵니다.
    $exchange_host = "graph.facebook.com";
    $exchange_path = "/v3.3/oauth/access_token";

    // 보낼 주소를 만들어 주도록 합니다.
    $mainAddr =
      $exchange_path
      . "?client_id=" . {app-id}
      . "&redirect_uri=" . {redirect-uri}
      . "&client_secret=" . {app-secret}
      . "&code=" . $code
    ;


    $addr = "https://" . $exchange_host . $mainAddr;
    echo "<br><br>";
    echo $addr;
    echo "<br><br>";


    // 보낼값을 만들어 줄 변수들을 만들어 줍니다.
    $endline = "\r\n";
    $req = "";

    // 보낼 데이터를 만들어 주도록 합니다.
    $req = "GET $mainAddr HTTP/1.1" . $endline
    . "Host: " . $exchange_host . $endline
    . "Connection: Close" . $endline . $endline
    ;





    // 페이스북 서버와 연결을 시도합니다.
    $fsock = @fsockopen( "ssl://" . $exchange_host , 443 );

    if( @!$fsock )
    {
      // $error_result['method_error'] = "토큰을 교환하기 위한 페이스북 서버 접근에 실패하였습니다.";
      echo "토큰 교환을 위한 소켓을 여는 데 실패했습니다.";
      exit;
    }



    // 토큰 데이터를 확인합니다.
    $headPassed = false;
    $AccessTokenJson = "";

    // 데이터 보내기를 합니다.
    fwrite( $fsock, $req );

    while( !feof($fsock) ) {
      $runCount++;
      // 한 줄 라인을 가지고 옵니다.
      $line = fgets($fsock, 128);

      // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
      if( $line == "\r\n" && !$headPassed )
      {
        $headPassed = true;
        continue;
      }

      // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
      if( $headPassed )
      {
        $AccessTokenJson .= $line;
      }

    }

    // 연결을 닫아 주도록 합니다.
    fclose( $fsock );


    print_r( $AccessTokenJson );

 

 

4. 로그인 유저의 정보 확인하기.

에세스 토큰을 교환하던 요령으로, 한번 더 http 요청을 하면됩니다.

    // json 문자열을 객체로 전환.
    $AccessTokenObj = json_decode( $AccessTokenJson );
    $token = $AccessTokenObj->access_token;




    // 접속한 유저의 정보를 가지고 옵니다.
    $me_host = "graph.facebook.com";
    $me_path = "/v3.3/me";


    $me_path =
      $me_path
      . "?access_token=" . $token;
      echo $me_path;
      echo "<br>"
      ;


    // 보낼값을 만들어 줄 변수들을 만들어 줍니다.
    $endline = "\r\n";
    $req = "";

    // 보낼 데이터를 만들어 주도록 합니다.
    $req = "GET $me_path HTTP/1.1" . $endline
    . "Host: " . $me_host . $endline
    . "Connection: Close" . $endline . $endline
    ;





    // 페이스북 서버와 연결을 시도합니다.
    $fsock = @fsockopen( "ssl://" . $me_host , 443 );

    if( @!$fsock )
    {
      // $error_result['method_error'] = "토큰을 교환하기 위한 페이스북 서버 접근에 실패하였습니다.";
      echo "프로필 확인을 위한 소켓을 여는 데 실패했습니다.";
      exit;
    }



    // 토큰 데이터를 확인합니다.
    $headPassed = false;
    $meJson = "";

    // 데이터 보내기를 합니다.
    fwrite( $fsock, $req );

    $runCount = 1;

    while( !feof($fsock) ) {
      $runCount++;
      // 한 줄 라인을 가지고 옵니다.
      $line = fgets($fsock, 128);

      // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
      if( $line == "\r\n" && !$headPassed )
      {
        $headPassed = true;
        continue;
      }

      // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
      if( $headPassed )
      {
        $meJson .= $line;
      }

    }

    // 연결을 닫아 주도록 합니다.
    fclose( $fsock );



    // 페이스 북으로 부터 access 토큰 교환 값을 표시합니다.
    echo "<br><br>respone of logined user profile from facebook:<br>";


    // 에세스 토큰을 확인해 주도록 합니다.
    // $AccessTokenObj = @json_decode( $AccessTokenJson );
    // $AccessToken = @$AccessTokenObj->access_token;

    print_r( $meJson );

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

php를 이용해 FCM으로 메시지를 보내기 위한 참고 문서 입니다.

 

[공식문서]

보내기 요청승인 : https://firebase.google.com/docs/cloud-messaging/auth-server?authuser=0 .

 

[참고문서]

php 문서 : https://link2me.tistory.com/1358 .

 

1. php 서버키 확인.

프로젝트에서, 톱니 바퀴 버튼을 눌러 프로젝트 설정 버튼을 눌러 주도록 합니다.

설정페이지에서 클라우드 메시징 탭을 눌러 서버키를 확인합니다.

그다음 안드로이드 앱에서 조사된 키값을 조사해 둡니다.

 

 

2. 보내기 요청하기.

공식 문서에 보내기 요청 승인 부분의 HTTP v1 보내기 요청 승인 부분이 있습니다. 이 부분을 확인하시면 됩니다.

그리고 메시지를 작성할 때는 여러 플랫폼의 메시지 맞춤설정을 꼭 확인해서 보내주세요. 헤더만 맞고 어떤 데이터를 보내든지 푸쉬는 성공으로 인식합니다. 그래서 앱이 갑자기 다운될 수 있습니다. php는 REST 부분을 보면됩니다.

애플과 안드로이드 공용으로 보내려면, 아래 형식에 맞춰 주면됩니다.

{
  "message":{
     "topic":"industry-tech",
     "notification":{
       "title": "$GOOG" up 1.43% on the day",
       "body":"GOOG gained 11.80 points to close at 835.67, up 1.43% on the day."
     },
     "android":{
       "ttl":"3600s",
       "notification"{
         "icon:stock_ticker_update"
         "color:#f45342"
       }
     },
     "apns": {
       "payload": {
         "aps": {
           "badge": "42"
         }
       }
     },
     "webpush":{
       "headers":{
         "TTL":"86400"
       }
     }
   }
 }

아래는 푸쉬를 보내기 위한 클래스 입니다.

class c_app
  {


    // 입력받은 값들을 저장해 주도록 합니다.
    public $serverKey;
    public $title;
    public $body;
    public $userToken;


    function __construct( $_serverKey, $_title, $_body, $_userToken )
    {

      // 입력 받은 값들을 저장해 주도록 합니다.
      $this->serverKey = $_serverKey;
      $this->title = $_title;
      $this->body = $_body;


      // 토크을 저장합니다.
      $this->userToken = $_userToken;

      // 토큰이 배열이 아닌 하나라면, 배열로 감싸줍니다.
      if( is_array( $this->userToken ) )
      {
        $this->userToken = array( $_userToken );
      }



    }


    function get_message()
    {


      // 하나의 데이터를 만들어 주도록 합니다.
      $messageArray['notification'] = array();
      $messageArray['notification']['title'] = $this->title;
      $messageArray['notification']['body'] = $this->body;
      $messageArray['registration_ids'] = [$this->userToken];
      return json_encode( $messageArray ) ;



    }



    function send()
    {

          $sendQuery = $this->get_message(  );

          // 보낼 데이터를 만들어 주기 위한 기본값을 설정합니다.
          $endline = "\r\n";
          $req = "";


          // 구글에서 요청한 필수 헤더를 추가합니다.
          $req = "POST /fcm/send HTTP/1.1" . $endline
          . "Host: fcm.googleapis.com" . $endline
          . "Content-Type: application/json" . $endline
          . "Authorization: key={$this->serverKey}" . $endline
          ;


          // POST 데이터를 보내기 위한 기본 헤더를 추가힙니다.
          $req .= "Content-Length: " . strlen($sendQuery) . $endline
          . "Connection: Close" . $endline
          ;

          // 헤더의 끝을 표시하는 빈 문자열을 설정합니다.
          $req .= $endline;

          // 내용을 추가해 보내어 줍니다.
          $req .= $sendQuery;
          ;

          // 해당 구글 서버와 연결을 시도합니다.
          $fsock = @fsockopen( "ssl://fcm.googleapis.com", 443 );

          // 구글 서버에 접속 실패한 경우.
          if( !$fsock )
          {
              echo "구글 서버에 접속 실패하였습니다.!";
              return;
          }

          // 데이터 보내기를 합니다.
          fwrite( $fsock, $req );


          // 데이터 받기를 위해 필요한 값들을 선언합니다.
          $headPassed = false;
          $TokenJson = "";


          // 데이터 받기가 완료될 때 까지 대기하면 데이터를 받아 출력합니다.
          while( !feof($fsock) )
          {

              // 한 줄 라인을 가지고 옵니다.
              $line = fgets($fsock, 128);

              // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
              if( $line == "\r\n" && !$headPassed )
              {
                  $headPassed = true;
                  continue;
              }

              // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
              if( $headPassed )
              {
                  $TokenJson .= $line;
              }

          }

          // 연결을 닫아 주도록 합니다.
          fclose( $fsock );


          // 받은 결과를 반환해 주도록 합니다.
          return $TokenJson;


    }






  }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

이 문서를 따라해 보거나 적용해 보려면, 트위터 개발자 계정이 있어야 합니다. 트위터 계정 만드는 것은 너무 쉬운 일이므로, 여기서는 다루지 않습니다.

 

[공식 문서]

 

 

[주요 사이트]

트위터 개발자 사이트 : https://developer.twitter.com .

 

 

1. OAuth 로그인(sns 로그인). 을 위한 준비.

OAuth 로그인의 핵심은, 이 로그인 기능을 이용하는 사이트에서는 로그인 단계에서는 관여를 하지 않고, 유저와 sns 사이트에서 로그인처리를 하고, 결과값을 이용 사이트에 되돌려 줍니다.

그 과정에서 리디렉션 기능이 사용 되는데, 로그인할 주소를 유저에게 리디렉션해서 주면, sns 로그인 화면이 표시되고, 로그인을 무사히 완료 되면, 다시 리디렉션을 이용해, 사이트로 접속해 Get 타입으로 결과 코드를 돌려 줍니다. 마지막 결과 코드를 돌려 받을  url 주소는 트위터 서버에 등록할 필요가 있습니다. ip 주소는 안되며, 도메인으로 시작해야 하는데, 테스트를 위한 localhost도 허용을 합니다.

저는 로컬 서버에서 Apache 웹사이트를 등록해 사용하고 있습니다. 주소는 다음과 같이 정해 두었습니다.

로그인 요청 주소 : http://localhost/p999/twitter_OAuth/req_code.php .
토큰 교환 주소 : http://localhost/p999/twitter_OAuth/exchange_token.php .

 

2. 개발자 적용하기.

개발자 페이지에 접속 하면 다음과 같은 페이지를 만날 것 입니다. 아직 개발자 계정으로 전환이 되어 있지않다면, 오른쪽 상단에 Apply 레이블이 표시 될 것 입니다. 이 것이 표시 되지 않으면, 이미 개발자 계정으로 전환된 상태 이므로, 다음 항목으로 넘어 가면 되며, 아니라면, 저와 같이 개발자 적용을 하면 됩니다. Apply 버튼을 눌러 주도록 합니다.

그러면, 개발자 계정을 적용하는 화면이 나옵니다. 여기서 [ Apply for a developer account ] 눌러 개발자 계정 전환 신청단계로 들어 갑시다.

개발자 계정을 적용하면 바로 개발자 계정을 살 수 있을 지 모르겠지만, 저 같은 경우 유효한 전화번호를 입력하지 않아, 적용이 되지 않은 상태였습니다. 일단 전화번호를 등록하는 버튼을 눌러 전화번호를 등록하겠습니다.

다음 화면이 나오면 전화번호를 등록해 주도록 합니다.

그럼 아래와 같이 전화 번호 인증이 되고, 버튼 Continue 상태가 됩니다. Continue 버튼을 눌러 줍니다.

그 다음 질문은 개인의 개발자 계정인지, 조직의 개발자 계정인지 묻습니다. 상황에 따라 선택하면 되는 데 개인을 선택할 경우, 단 2개만 묻습니다. 이름과 사는 국가. 하지만, 계정 문자 @계정명 을 지정할 수 없이 이상한 값을 받습니다. 그러므로, 조직을 선택하도록 합니다.

아래와 같은 요령으로, 작성한 뒤 [Continue] 버튼을 눌러 주도록 합니다.

다음 페이지는 트위터 API를 이용해 어떤 프로젝트를 진행하려는 지 알려 달라고 합니다. 폼을 보시면 아시겠지만, 최소 300자 이상의 프로젝트 설명난이 있습니다. 한글도 재대로 못 쓰는 제가 영어로 300자 문장을 만들기란 여간 힘들지 않았습니다. 그래도 써야 한다니 써 드렸습니다. 구글 번역기와 함께. (영포자가 쓰기에는 매우 높은 벽이 였습니다.).

그 다음 서비스 약관을 허용하는지 묻는 것 입니다. Accept를 선택하고 스크롤을 쭉 내린 뒤 체크 박스가 활성화 돠면, 첫 항목만 체크 한뒤, [ Submit application ] 버튼을 눌러 주시면 됩니다.

마지막 작업으로 Email 인증 처리를 하는 작업을 합니다. 

그럼 아래와 같은 메일이 왔을 것 입니다. (오지 않았다면, 스팸으로 분류 되었는지 확인해 주세요.). [ Confirm your email ] 버튼을 눌러 이메일을 인증하도록 합니다.

 

3. 앱 만들기.

개발자 계정으로 전환을 완료했다면, 트위터를 API를 사용하려는 홈페이지, 모바일 앱, 등을 관리하는 일종의 프로젝트 개념의 앱을 만들어야 하며, 그곳에 우리가 무엇인가를 하기 위한 셋팅을 해야 합니다. 말로 설명하는 것 보다 일단 앱을 만들고 시작해 보도록 합시다.

처음 개발자 사이트에 접속하고 로그인 하면 다음과 같은 화면을 만날 수 있습니다. 여기서 Apps를 선택해 주도록 합니다.

그리고, 나온 화면에서, [ Create an app ] 버튼을 눌러 주도록 합니다.

여기 서 애플 개발자 계정을 적용하지 않았다면, 다음과 같은 창을 만날 수 있습니다.

우리는 이미 개발자 적용이 되어 있으므로, 뜨지 않을 것 입니다. 만약 뜬다면, 개발자 계정으로 전환이 완벽하게 이뤄 지지 않은 경우 이므로, 문서의 처음으로 돌아가 천천히 따라해 주시기 바랍니다. 정상적이라면 아래와 같은 폼이 뜨고, 값을 입력하고, Create 버튼을 눌러 주면됩니다.

대개의 값은 신경 쓸 필요 없지만, Enable Sign in with Twitter를 체크해, 나오는 Callback URL 은 유저가 트위터 로그인 후 결과를 돌려 받을 페이지를 입력해야 합니다. 우리는 문서 처음에 http://localhost/p999/twitter_OAuth/exchange_token.php 페이지를 결과를 받을 주소로 정했습니다. (여러 분은 다르게 정해도 상관은 없지만, 이 것으로 로그인 결과를 콜백 받는다는 사실은 알고 계셔야 합니다.).

저는 아래와 같이 작성했습니다. (트위터는 사용 목적등을 서술하는 것을 많이 요구해, 영포자인 저를 매우 힘들게 하는 군요.).

누르면, 붉은 색 3가지 항목이 나오는데, 전 뭔가 잘 못 입력했나하고, 살펴 보니, 우리가 앞서 승인했던 약관 내용을 상기 시키며, 3가지 목적으로 사용하면 안됨을 경고 하고 있었습니다. Create 버튼을 눌러 줍니다.

그럼 아래와 같이 앱이 생성된 정보가 표시됩니다.

여기서 Keys and tokens 텝을 눌러 api키와 Access token & access token secret 항목 아래, [Create] 버튼을 눌러 주도록 합니다.

다음에 계속 이어 쓰겠습니다.

 

 

 

 

 

 

 

 

 

Posted by 창업닉군
,

OAuth 2.0 을 이용해 Token을 얻어, 이  토큰으로 REST API를 통한 서버의 자원에 접근해 이용하는 방법은 이제 보편화된 방법 입니다. OAuth.2.0은 대부분 http/1.1을 이용하기 때문에, 대부분은 웹서버라면 다 이용할 수 있습니다.

요즘 많이 사용하게 되어 한 번쯤 정리해 둘 필요가 있을 것 같아 블로그에 글을 남겨 둡니다.

 

[공식 문서]

구글 OAuth 2.0 OverView : https://developers.google.com/identity/protocols/OAuth2?hl=ko .
구글 OAuth 2.0 for Web Server Applications : https://developers.google.com/identity/protocols/OAuth2WebServer?hl=ko .
유저 프로필 요청 : https://developers.google.com/gmail/api/v1/reference/users/getProfile .

 

[주요 사이트]

구글 클라우드 콘솔 : https://console.developers.google.com .

 

 

1. 구글 클라우드 콘솔에 프로젝트 및 Gamil 라이브러리 사용설정.

구글 로그인 기능은 자신의 구글 자원에 접근(구글 드라이브, 메일 등) 하기 위해 처음 로그인 하는 부분만 활용해 로그인 연동 처리를 하는 것 입니다. 그래서 최소 하나의 API를 사용하겠다 라고, 신청을 해야 그 다음 부터 이용이 가능합니다. 우리는 Gmail을 신청할 것 입니다. 구글 사용자라면 누구나, Gmail을 이용하고, 모든 유저가 활성화 되어 있기 때문입니다.

1) 프로젝트 생성.

목적별로 프로젝트를 생성한 후, 그 프로젝트에 Gmail을 생성합니다. 우리는 php google oauth 라는 프로젝트를 만들어 보도록 합시다. 처음 구글에 접속하면 다음과 같은 페이지가 표시될 것 입니다. 여기서 만들기를 눌러 프로젝트 만들기 창으로 접근합니다.

모든 사항을 입력한 후 만들기 버튼을 눌러 줍니다. (프로젝트 아이디를 변경해도 상관없습니다. 하지만 여기서는 하지 않았습니다.).

2) Gmail 라이브러리 추가.

그럼 php google oauth 프로젝트가 자동으로 선택되고 (하나 뿐 이므로), API 라이브러리를 추가하라는 메시지를 만납니다. 여기서 우리가 필요로 하는 Gmail API를 추가 해 보도록 합시다.

그럼.  API 라이브러리를 관리하는 화면이 나오는데, 왼쪽 메뉴의 이메일을 선택해 줍니다.

Gmail API를 선택합니다. (이메일은 Gmail API 하나만 있지만, 다른 카테고리는 여러개의, API가 표시될 수 있습니다.)

Gmail API 상세화면에서 사용설정 버튼을 눌러 사용할 수 있도록 해 줍니다.

 

2. OAuth 2.0 동의 화면 설정.

OAuth 로그인을 하는 과정에서 어떤 권한을 사용하는지등을 나타내는 화면이 표시 됩니다. 이 화면을 표시하기 위한 동의 화면을 구성하도록 하겠습니다.

아래와 같이 OAuth 동의 화면 탭을 선택해 나온 페이지에 애플리케이션 이름을 입력하고, 하단의 저장 버튼을 눌러 줍니다.

 

 

3. OAuth 2.0을 위한 클라이언트 ID 만들기.

구글 클라우드 API를 사용하기 위해서는 반드시 OAuth 2.0 방식을 통한 로그인 후 토큰을 획득해야 합니다. 이 과정에서 프로젝트를 구분하는 클라이언트 ID가 필요한데, 지금 만들어 보도록 하겠습니다.

아래와 같이 사용자 인증 정보 탭을 선택하고, OAuth 클라이언트 ID 생성을 눌러 줍니다.

클라이언트 성성 화면에서, 웹 애플리케이션을 선택하고, 이름은 적당히 입력해 주고, 생성 버튼을 눌러 줍니다.

그리고 나면 OAuth 클라이언트 정보를 확인시켜 주는 창이 뜰 텐데 일단 확인을 누르고 닫아 줍니다.

 

4. 리디렉션 주소 설정.

OAuth 2.0에서는 필연적으로 사용자가 계정의 아이디 및 패스워드를 입력하게 됩니다. 이런 과정을 통해 서버 운영자인 우리는, 사용자의 계정이나 패스워드를 저장할 필요성이 사라집니다. 사용자가 로그인을 무사히 완료하면, 서버쪽으로 성공 결과 및 인증코드를 돌려 주는 데, 그 주소를 리디렉션 주소라고 합니다. 이 값은 중요하므로, 구글에 등록된 주소로만 리디렉션 해 줍니다.

이 과정에서 도메인이 필요한 데, 우리는 테스트 과정이므로, localhost를 사용할 것 입니다. 실제 서비스를 한다면, 도메인을 이용해 구성해 주세요.

저는 웹페이지 중 http://localhost/p999/google_OAuth2/token_exchange.php 라는 주소를 설정할 것 입니다. 파일이름이 token_exchange.php 인 이유는 받은 인증 코드를 이용해 토큰으로 교환할 것 이기 때문입니다.

사용자 인증탭에 OAuth 2.0에 사용할 클라이언트 ID의 수정 버튼을 눌러 줍니다. 그리고, 나온 페이지에 승인된 리디렉션 URI에 리디렉션 주소를 입력하고( 꼭 엔터를 눌러 줍니다. ), 저장 버튼을 눌러 줍니다.

 

5. 인증을 구현을 위한 필요 정보 조사.

인증에 사용할 클라이언트 ID를 눌러 주도록 합니다.

페이지에서 각각의 정보를 수집합니다.

클라이언트 ID : 107557211118-lpfm0l4gs5ffpas8cbjn5bp71f2hbag5.apps.googleusercontent.com
크라이언트 보안 비밀 : NaJSvmGdShGg1kkXkGdvHp4T
승인된 리디렉션 URI : http://localhost/p999/google_OAuth2/token_exchange.php

 

6. 인증서 코드 요청 페이지 만들기.

저는 PC의 웹서버에, /p999/google_OAuth2/ 폴더 속에서 웹 파일들을 만들어 주고 있습니다. 코드를 요청하는 페이지 이름은 request_code.php 로 정하고 코딩하였습니다. 이 페이지에서 사용되는 내용은, Using OAuth 2.0 for Web Server Application (위에 링크 있습니다.)공식 문서에 HTTP/REST 부분의, 내용 입니다.

scope 의 권한 부분은 OAuth 2.0 API Scopes ( 링크 )에서 확인할 수 있는 데, 우리는 메일의 모든 권한을 요청할 것 입니다. 그 권한은 ( https://mail.google.com/ ) 입니다.

state 값은 리디렉션 시 그대로 다시 전달 받을 값 입니다. 로그인 과정에서 수많은 유저가 동시에 접속하면, 어떤 유저의 로그인인지 확인할 필요가 있습니다. 이때 사용하면 좋으며, 세션을 사용한다면, 사용하지 않아도 상관이 없습니다.

코드 자체는 로그인할 주소를 입력한 뒤, 리디렉션 해 주면 끝이 납니다. 아래는, request_code.php 페이지의 내용 입니다.

<?php



    // 주요 값들.
    $client_id = "107557211118-lpfm0l4gs5ffpas8cbjn5bp71f2hbag5.apps.googleusercontent.com";
    $client_secret = "NaJSvmGdShGg1kkXkGdvHp4T";
    $redirection_url = "http://localhost/p999/google_OAuth2/token_exchange.php";
    $scope = "https://mail.google.com/";

    // 인증 코드 주소 생성.
    $reqAddr = "https://accounts.google.com/o/oauth2/v2/auth"
    . "?client_id=" . $client_id
    . "&redirect_uri=" . urlencode( $redirection_url )
    . "&scope=" . urlencode( $scope )
    . "&state=OK"
    . "&access_type=offline"
    . "&include_granted_scopes=true"
    . "&response_type=code"
    ;

    // 지정한 주소로 리디렉션 시키기.
    header( 'Location: ' . $reqAddr );

?>

인증 코드를 무사히 넘겨 받았을 때 결과를 리디렉션 받아 토큰을 교환하는 페이지의 소스는 일단 아래와 같이 둡니다.

<?php


    print_r( $_GET );

자그럼 request_code.php 파일을 실행해 보도록 합시다. 정상적으로 리디렉션 된다면, 아래와 같은 페이지를 만날 수 있습니다.

일반적으로 구글 로그인 화면이므로, 쉽게 무엇을 넣어야 할 지 알 수 있을 것 입니다. 계속해서 로그인을 하도록 합니다.

로그인이 완료되면, 우리가 scope로 요청했던, Gmail의 모든 권한을 부여해달라는 페이지가 뜹니다. 우리는 현재 우리 계정으로 로그인하지만, 일반 유저가 우리 홈페이지에 접근할 때, 이 페이지를 보개 될 것이며, 자신의 Gmail을 이용할 것을 알게 됩니다. 일단 계속 해서 허용을 해 봅시다.

자 그럼 우리가 설정해 놓은 리디렉션 페이지로 GET을 통해 code, scope, state 값이 넘어 온 것을 확인할 수 있습니다.

 

7. 토큰 교환

우리가 리디렉션 받은 페이지에서, 받은 코드값을 사용해 토큰을 받아 오도록 하겠습니다. 이 부분은 서버에서 POST 통신을 해야 하므로, 약간의 난이도(?)가 있습니다.

POST 통신을 위해, fsocketopen 메소드를 상용하겠습니다. 공식 문서에 보면, 아래와 같이 데이터를 보내 도록 되어 있습니다. 우리도 그 값 그대로 보내면 되겠습니다. 공식 문서에는 endpoint가 https://www.googleapis.com/oauth2/v4/token 라고 되어 있습니다. 여기로 접속할 것 입니다.

POST /oauth2/v4/token HTTP/1.1
Host: www.googleapis.com
Content-Type: application/x-www-form-urlencoded

code=4/P7q7W91a-oMsCeLvIaQm6bTrgtp7&
client_id=your_client_id&
client_secret=your_client_secret&
redirect_uri=https://oauth2.example.com/code&
grant_type=authorization_code

아래는 토큰 교환을 하는 코드 입니다.

    // 주요 값들.
    $client_id = "107557211118-lpfm0l4gs5ffpas8cbjn5bp71f2hbag5.apps.googleusercontent.com";
    $client_secret = "NaJSvmGdShGg1kkXkGdvHp4T";
    $redirection_url = "http://localhost/p999/google_OAuth2/token_exchange.php";
    $scope = "https://mail.google.com/";



    // 보낼 쿼리 만들기.
    $sendQuery = ""
    . "code=" . $_GET['code']
    . "&client_id=" . $client_id
    . "&client_secret=" . $client_secret
    . "&redirect_uri=" . urlencode( $redirection_url )
    . "&grant_type=authorization_code"
    ;


    // 보낼 데이터를 만들어 주기 위한 기본값을 설정합니다.
    $endline = "\r\n";
    $req = "";
    
    
    // 구글에서 요청한 필수 헤더를 추가합니다.
    $req = "POST /oauth2/v4/token HTTP/1.1" . $endline
    . "Host: www.googleapis.com" . $endline
    . "Content-Type: application/x-www-form-urlencoded" . $endline
    ;

    
    // POST 데이터를 보내기 위한 기본 헤더를 추가힙니다.
    $req .= "Content-Length: " . strlen($sendQuery) . $endline
    . "Connection: Close" . $endline
    ;
    
    // 헤더의 끝을 표시하는 빈 문자열을 설정합니다.
    $req .= $endline;
    
    // 내용을 추가해 보내어 줍니다.
    $req .= $sendQuery;
    ;

    // 해당 구글 서버와 연결을 시도합니다.
    $fsock = @fsockopen( "ssl://www.googleapis.com", 443 );

    // 구글 서버에 접속 실패한 경우.
    if( !$fsock )
    {
        echo "구글 서버에 접속 실패하였습니다.!";
        exit;
    }
    
    // 데이터 보내기를 합니다.
    fwrite( $fsock, $req );


    // 데이터 받기를 위해 필요한 값들을 선언합니다.
    $headPassed = false;
    $TokenJson = "";


    // 데이터 받기가 완료될 때 까지 대기하면 데이터를 받아 출력합니다.
    while( !feof($fsock) )
    {

        // 한 줄 라인을 가지고 옵니다.
        $line = fgets($fsock, 128);

        // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
        if( $line == "\r\n" && !$headPassed )
        {
            $headPassed = true;
            continue;
        }

        // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
        if( $headPassed )
        {
            $TokenJson .= $line;
        }

    }

    // 연결을 닫아 주도록 합니다.
    fclose( $fsock );

    // 받아 온 Token Json을 토큰 객체로 만들어 줍니다.
    $TokenObj = json_decode( $TokenJson );

    // 받아 온 토큰을 출랙해 줍니다.
    echo "받은 토큰은 아래와 같습니다.<br>";
    print_r( $TokenObj );
    echo "<br>---------------------------<br><br>";

 

8. 유저 프로필 요청.

gmail의 간단한 사용자의 정보를 가지고 옵니다. GET 타입이므로, 리디렉션 처리를 하면 간단하지만, 우리는 지금 학습단계이므로, fsockopen 을 이용해 구현해 보도록 하겠습니다.

gmail 의 유저 프로필 요청을 합니다. 공식 문서를 참고해 주시고, 아래 코드를 추가하면 됩니다. 아마 별다른 설명은 필요 없을 것이라 봅니다.

    // 보낼 문장을 반들어 줍니다.
    $userinfor_req = "GET /gmail/v1/users/me/profile HTTP/1.1" . $endline
    . "Authorization: Bearer " . $TokenObj->access_token . $endline
    . "Host: www.googleapis.com" . $endline
    . "Connection: Close" . $endline

    . $endline


    ;


    // 해당 구글 서버와 연결을 시도합니다.
    $fsock = @fsockopen( "ssl://www.googleapis.com", 443 );

    // 구글 서버에 접속 실패한 경우.
    if( !$fsock )
    {
        echo "구글 서버에 접속 실패하였습니다.!";
        exit;
    }
    
    // 데이터 보내기를 합니다.
    fwrite( $fsock, $userinfor_req );




    // 데이터 받기를 위해 필요한 값들을 선언합니다.
    $headPassed = false;
    $profileJson = "";


    while( !feof($fsock) )
    {

        // 한 줄 라인을 가지고 옵니다.
        $line = fgets($fsock, 128);

        // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
        if( $line == "\r\n" && !$headPassed )
        {
            $headPassed = true;
            continue;
        }

        // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
        if( $headPassed )
        {
            $profileJson .= $line;
        }

    }


    // 연결을 닫아 주도록 합니다.
    fclose( $fsock );



    // 가지고 온 유저 데이터를 출력하도록 합니다.
    echo "확인한 유저 정보는 아래와 같습니다.<br>";
    echo $profileJson;
    

잘 실행되었다면, 아래와 같은 페이지를 볼수 있습니다.

 

 

마지막. 전체 코드 입니다.

<?php



    // 주요 값들.
    $client_id = "107557211118-lpfm0l4gs5ffpas8cbjn5bp71f2hbag5.apps.googleusercontent.com";
    $client_secret = "NaJSvmGdShGg1kkXkGdvHp4T";
    $redirection_url = "http://localhost/p999/google_OAuth2/token_exchange.php";
    $scope = "https://www.googleapis.com/auth/gmail.readonly";
    // $scope = "profile|email|openid";
    // $scope = urlencode( $scope );


    // 보낼 쿼리 만들기.
    $sendQuery = ""
    . "code=" . $_GET['code']
    . "&client_id=" . $client_id
    . "&client_secret=" . $client_secret
    . "&redirect_uri=" . urlencode( $redirection_url )
    . "&grant_type=authorization_code"
    ;


    // 보낼 데이터를 만들어 주기 위한 기본값을 설정합니다.
    $endline = "\r\n";
    $req = "";
    
    
    // 구글에서 요청한 필수 헤더를 추가합니다.
    $req = "POST /oauth2/v4/token HTTP/1.1" . $endline
    . "Host: www.googleapis.com" . $endline
    . "Content-Type: application/x-www-form-urlencoded" . $endline
    ;

    
    // POST 데이터를 보내기 위한 기본 헤더를 추가힙니다.
    $req .= "Content-Length: " . strlen($sendQuery) . $endline
    . "Connection: Close" . $endline
    ;
    
    // 헤더의 끝을 표시하는 빈 문자열을 설정합니다.
    $req .= $endline;
    
    // 내용을 추가해 보내어 줍니다.
    $req .= $sendQuery;
    ;

    // 해당 구글 서버와 연결을 시도합니다.
    $fsock = @fsockopen( "ssl://www.googleapis.com", 443 );

    // 구글 서버에 접속 실패한 경우.
    if( !$fsock )
    {
        echo "구글 서버에 접속 실패하였습니다.!";
        exit;
    }
    
    // 데이터 보내기를 합니다.
    fwrite( $fsock, $req );


    // 데이터 받기를 위해 필요한 값들을 선언합니다.
    $headPassed = false;
    $TokenJson = "";


    // 데이터 받기가 완료될 때 까지 대기하면 데이터를 받아 출력합니다.
    while( !feof($fsock) )
    {

        // 한 줄 라인을 가지고 옵니다.
        $line = fgets($fsock, 128);

        // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
        if( $line == "\r\n" && !$headPassed )
        {
            $headPassed = true;
            continue;
        }

        // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
        if( $headPassed )
        {
            $TokenJson .= $line;
        }

    }

    // 연결을 닫아 주도록 합니다.
    fclose( $fsock );

    // 받아 온 Token Json을 토큰 객체로 만들어 줍니다.
    $TokenObj = json_decode( $TokenJson );

    // 받아 온 토큰을 출랙해 줍니다.
    echo "받은 토큰은 아래와 같습니다.<br>";
    print_r( $TokenObj );
    echo "<br>---------------------------<br><br>";





    // [-- 아래는 유저 프로필 가지고 오기 관련 --]

    
    // 보낼 문장을 반들어 줍니다.
    $userinfor_req = "GET /gmail/v1/users/me/profile HTTP/1.1" . $endline
    . "Authorization: Bearer " . $TokenObj->access_token . $endline
    . "Host: www.googleapis.com" . $endline
    . "Connection: Close" . $endline

    . $endline


    ;


    // 해당 구글 서버와 연결을 시도합니다.
    $fsock = @fsockopen( "ssl://www.googleapis.com", 443 );

    // 구글 서버에 접속 실패한 경우.
    if( !$fsock )
    {
        echo "구글 서버에 접속 실패하였습니다.!";
        exit;
    }
    
    // 데이터 보내기를 합니다.
    fwrite( $fsock, $userinfor_req );




    // 데이터 받기를 위해 필요한 값들을 선언합니다.
    $headPassed = false;
    $profileJson = "";


    while( !feof($fsock) )
    {

        // 한 줄 라인을 가지고 옵니다.
        $line = fgets($fsock, 128);

        // 아직 헤더는 아니지만, 헤더의 끝을 만난 경우, 헤더가 끝났음을 마킹하고, 종료합니다.
        if( $line == "\r\n" && !$headPassed )
        {
            $headPassed = true;
            continue;
        }

        // 헤더가 아닌 경우만, 값을 출력하도록 합니다.
        if( $headPassed )
        {
            $profileJson .= $line;
        }

    }


    // 연결을 닫아 주도록 합니다.
    fclose( $fsock );



    // 가지고 온 유저 데이터를 출력하도록 합니다.
    echo "확인한 유저 정보는 아래와 같습니다.<br>";
    echo $profileJson;
    

 

 

 

 

 

 

 

Posted by 창업닉군
,