안경잡이개발자

728x90
반응형

  흔히 우리가 앱을 개발할 때는 페이스북(Facebook) 회원가입/로그인 기능을 구현하곤 합니다. 소셜 로그인 기능에서 가장 중요한 것은 서버에서 이를 검증하는 것입니다. 이미 페이스북 계정으로 가입이 된 사용자의 로그인을 처리하는 소스코드는 PHP로 다음과 같이 작성할 수 있습니다. 이 때 해당 서버에서는 이메일(Email)을 기준으로 회원을 구분한다고 가정합니다. 다시 말해 Facebook API로부터 Access Token으로 이메일 정보를 받아 와서, 그것으로 서버에서 로그인 처리를 시켜주는 것입니다.

 

  이미 사용자가 앱에서 로그인을 했다고 가정하고, Access Token을 서버로 보냈을 때 이를 처리하는 예제입니다. 다음의 소스코드를 참고하시면 될 것 같습니다.

// 사용자로부터 Facebook 로그인 이후 Access Token을 받습니다.
$access_token = $this->input_check('access_token');
$client = new \GuzzleHttp\Client();
if($access_token == "") {
    $this->output->set_status_header(400); // 입력 값 형식이 바르지 않습니다.
    exit;
}
try {
    // Facebook Graph API를 이용하여 Email 정보를 받아올 수 있습니다.
    $response = $client->request('GET', 'https://graph.facebook.com/me?fields=name,email&access_token='.$access_token);
    $body = $response->getBody();
    if($response->getStatusCode() == 400) {
        $this->output->set_status_header(500);
        exit;
    }
    $json_response = json_decode($body, true);
    // Facebook Graph API로부터 Email 정보를 받아와 출력합니다.
    echo $json_response['email'];
    /*
    // 아래는 로그인 인증 수행을 위한 처리 로직 예제입니다.
    $email_data['member_email'] = $json_response['email'];
    $result = $this->model_login->check_signup_type($email_data);
    if($result) {
        switch($result->signup_type) {
            case '0' :
                $this->output->set_status_header(503); // 일반 회원으로 가입한 계정입니다.
                exit; break;
            default:
                $info = $this->model_login->get_info_by_email($email_data);
                if(empty($info)) {
                    $this->output->set_status_header(501); // 존재하지 않는 계정입니다.
                    exit;
                }
                $token = array(
                    "exp" => time() + (60 * 60 * 24 * 7), // Refresh Token의 유효 기간은 7일입니다.
                    "member_idx" => $info->member_idx,
                    "token_type" => "refresh_token"
                );
                $jwt = JWT::encode($token, $this->jwt_key);
                $response = array("refresh_token" => $jwt);
                echo json_encode($response);
        }
    } else {
        $this->output->set_status_header(501); // 존재하지 않는 계정
        exit;
    }
    */
} catch (Exception $e) {
    // 예외 처리를 진행합니다.
}

 

728x90
반응형