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

 

[공식문서]

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 창업닉군
,

sendmail 혹은 postfix를 설치하면, 메일을 보내는 것은 문제가 없습니다. 하지만, 수많은 지능적인 스팸메일들로 인해 대형 메일 서버(특히 GMail)는 추가적인 형식을 갖추어야 겨우 메일을 스팸으로 처리 할 것인지를 심사해 줍니다. 일단 여러가지 방법으로 스팸으로 처리 되지 않도록 하겠습니다.

 

1. mail-tester.com

우리가 보낸 혹은 보내게될 메일에 어떤 문제가 있는 지 검사를 해 줍니다. 일단 사이트로 접속을 하면, 처음 부터 자신에게 보낼 메일 주소를 알려 줍니다.

 

메일주소는 접속할 때 마다 바뀝니다. 알려준 메일로 주소를 보내어 봅시다. (창은 닫으면 안됩니다.). 그리고 메일이 도착하는 시간 30~1분 뒤 THEN CHECK YOUR SCORE 버튼을 눌러 주도록 합니다.

sendmail만 설치하고, 메일을 보냈다면, 다음과 같은 결과를 보게 될 것 입니다. 10점 만점에 -12.2 (센스 있게 0점으로 표시해 주더군요.)

 

각각의 + 항목을 눌러 본 세부적인 결과는 다음과 같습니다.

 

큰 문제는 도메인이 설치 되지 않아 발생하는 문제였습니다.

 

저는 위 상황을 보고, Reverse domain의 문제가 있다라고 보고, Reverse domain을 신청했습니다. Reverse domain은 인터넷 네트워크를 제공하는 장비 회사에 신청해야 합니다. 우리나라에서 직접 회선을 신청해 사용할 경우, KT 나 SKT 등이 될 것 입니다. 저는 aws에서 EC2( Elastic Compute 2 )라는 가상 머신에 ubunte 서비스를 사용하므로, aws에 신청을 했습니다.

먼저, aws에 지원에 리버스 도메인 신청서 제출 방법을 물었고, 아마존에서는 다음과 지원서 작성 양식폼의 주소를 알려 주었습니다. https://aws.amazon.com/forms/ec2-email-limit-rdns-request .

로그인된 상태라면 폼이 바로 보입니다.

작성을 해서 보냈고, 답을 기다리고 있습니다. (답이 오면 계속해서 적어 나가겠습니다.)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Ubuntu > Ubuntu 옛글' 카테고리의 다른 글

MongoDB 설치 Ubuntu  (0) 2019.07.04
ubuntu sendmail 설치  (0) 2019.06.17
Postfix 설치 (ubuntu, SquirrelMail, apache, php)  (0) 2019.06.10
우분투 18.04 vsftp 설치  (0) 2019.06.04
Posted by 창업닉군
,

ubuntu에서 메일을 주고 받으려면, sendmail 이나 postfix를 설치하면 됩니다. 요즘 postfix를 사용하는 곳이 많은 것 같지만 저와는 상성이 별로 좋지 못하더군요. 저는 쉽게 설치되고, 잘 동작하는 sendmail을 써 보도록 하겠습니다. sendmail을 설치하고, 이 곳 저 곳으로 메일을 보내어 보면, 많은 곳에서 (특히 Gmail) 스팸 처리가 됩니다. 다음 문서에서 스팸 처리를 피하는 것에대해서 다뤄 보려고 합니다. (저도 아직 해 보지 않아 스팸 처리를 피할 수 있는지 확신은 없습니다.)

 

1. sendmail SMTP Server 설치.

설치는 매우 쉽습니다.

apt-get install sendmail

 

2. /etc/mail/sendmail.mc 파일 변경.

/etc/mail/sendmail.mc 파일을 열어 아래 2줄을 지웁니다. (왜 지우는지는 아직 모르겠음->안지워도 잘 갔던 느낌이).

DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl
DAEMON_OPTIONS(`Family=inet, Name=MTS-v4, Port=smtp, Addr=127.0.0.1')dnl

 

3. 샌드메일 재 시작.

sudo service sendmail restart

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Ubuntu > Ubuntu 옛글' 카테고리의 다른 글

MongoDB 설치 Ubuntu  (0) 2019.07.04
스팸메일로 처리 되지 않게 하기  (0) 2019.06.17
Postfix 설치 (ubuntu, SquirrelMail, apache, php)  (0) 2019.06.10
우분투 18.04 vsftp 설치  (0) 2019.06.04
Posted by 창업닉군
,