취업/소셜로그인

[ci4] 페이스북 sdk php 버전용.

카슈밀 2022. 6. 21. 17:38
반응형

https://teserre.tistory.com/2

 

[PHP]페이스북 로그인 API 연동하기(공식 SDK 사용)

PHP 8.0 이상을 사용하시는 분들은 curl을 사용하셔야 합니다. 8.0은 사용이 가능하지만 최신 SDK를 사용할 수 없고, 8.1부터는 제외된 기능때문에 사용이 불가능합니다. 해당하시는 분들은 https://teser

teserre.tistory.com

https://teserre.tistory.com/21

 

[PHP]페이스북 로그인 연동하기(curl 사용)

📢 이 게시글은 아래의 사양에서 테스트하였습니다. Server OS : Ubuntu 20.04.3 LTS WebServer : Apache 2.4 Backend : PHP 8.1 앱 생성 및 기본 설정 방법과 공식 PHP SDK를 사용하는 방법은 https://teserre.ti..

teserre.tistory.com

찾다 찾다 못 찾아서

자바스크립트 sdk를 다 적용했더니 보안적으로 너무 위험해서... 헤매던 도중에 발견한 php sdk 설명서

이걸 왜 숨기는 지 잘 모르겠다.

https://developers.facebook.com/docs/graph-api/reference/user/?locale=ko_KR 

 

Graph API User - 문서 - Facebook for Developers

sub_type enum {ANYTHING, NOTHING, HASHES, USER_IDS, HASHES_OR_USER_IDS, MOBILE_ADVERTISER_IDS, EXTERNAL_IDS, MULTI_HASHES, TOKENS, EXTERNAL_IDS_MIX, HOUSEHOLD_EXPANSION, WEB_PIXEL_HITS, MOBILE_APP_EVENTS, MOBILE_APP_COMBINATION_EVENTS, VIDEO_EVENTS, WEB_PI

developers.facebook.com

composer require facebook/graph-sdk
// view.php

<a id="Facebook_login" class="socials__social icofont-facebook" href="<?= $loginUrl; ?>">
    <div class="visually-hidden">facebook</div>
</a>

// view 컨트롤러
use COMPOSERPATH; // 컴포저의 경로를 잡아준다.

$fb = new \Facebook\Facebook([
    'app_id' => 'id',	//페이스북 앱 id
    'app_secret' => '시크릿 키',	//페이스북 앱 시크릿 코드
    'default_graph_version' => 'v14.0',	//api 버전.
]);

$helper = $fb->getRedirectLoginHelper();

//사용자정보에 접근할 권한 옵션. 추가 옵션은 공식 문서 참조
$permissions = ['public_profile','email'];

//로그인 주소 생성. callback 주소 입력
$loginUrl = $helper->getLoginUrl(BASEURL.'/api/facebookAuth', $permissions);

$data['loginUrl'] = $loginUrl;

view('페이지', $data);
// Facebook
    public function facebookAuth() {
        $fb = new \Facebook\Facebook([
            'app_id' => '페이스북 id',
            'app_secret' => '페이스북 시크릿 키',
            'default_graph_version' => 'v14.0',
        ]);
        
        $helper = $fb->getRedirectLoginHelper();

        //state 에러가 발생하는 경우 추가
        if (isset($_GET['state'])) {
            $helper->getPersistentDataHandler()->set('state', $_GET['state']);
        }
        
        // 사용자 액세스 토큰 획득
        try {
            $accessToken = $helper->getAccessToken();
        } catch(Facebook\Exceptions\FacebookResponseException $e) {
            echo 'Graph returned an error: ' . $e->getMessage();
            exit;
        } catch(Facebook\Exceptions\FacebookSDKException $e) {
            echo 'Facebook SDK returned an erro: '.$e->getMessage();
            exit;
        }
        
        //각종 에러 처리
        if(!isset($accessToken)) {
            if($helper->getError()) {
                header('HTTP/1.1 401 Unauthorized');
                echo "Error: " . $helper->getError()."\n";
                echo "Error Code: " . $helper->getErrorCode()."\n";
                echo "Error Reason: " . $helper->getErrorReason()."\n";
                echo "Error Description: " . $helper->getErrorDescription()."\n";
            } else {
                header('HTTP/1.1 400 Bad Request');
                echo 'Bad request';
            }
            exit;
        }

        //사용자 액세스토큰 출력
        echo '<h3>Access Token</h3>';
        var_dump($accessToken->getValue());
        
        $oAuth2Client = $fb->getOAuth2Client();
        
        $tokenMetadata = $oAuth2Client->debugToken($accessToken);

        //사용자 토큰 정보 출력
        echo '<h3>Metadata</h3>';
        var_dump($tokenMetadata);
        
        // $tokenMetadata->validateAppId('{app_id}'); 이거 2개 타면 중간에 죽어버려 잠시 꺼버림.
        
        // $tokenMetadata->validateExpiration();

        echo '<h3>Email</h3>';
        $emailRaw = ($fb->get('/me?fields=email', $accessToken)); // 이메일 주소를 호출한다.
        echo var_dump($emailRaw->getGraphUser()); // 이메일과 회원 id 가져오기
        echo var_dump($emailRaw->getGraphUser()->getEmail()); // 이메일 주소만 가져오기

        //장기 토큰 변환
        if(!$accessToken->isLongLived()) {
            try{
                $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
                $response = $fb->get('/me', $accessToken);
            } catch(Facebook\Exceptions\FacebookSDKException $e) {
                echo "<p>Error getting long-lived access token: " . $e->getMessage()."</p>\n\n";
                exit;
            }
            $graphNode = $response->getGraphNode();
        }
        
        //변환된 장기 토큰 출력
        echo '<h3>Long-lived</h3>';
        var_dump($accessToken->getValue());
        
        //액세스 토큰 세션에 저장
        $_SESSION['fb_access_token'] = $accessToken;

        

    }
728x90