print( sjw.iq == 200) output : true

[PHP,Laravel] 구글 로그인 본문

GoogleAPI

[PHP,Laravel] 구글 로그인

sjwiq200 2019. 2. 13. 01:06
728x90
반응형

PHP Lavavel 프레임워크를 이용해서 구글 로그인을 개발하는 일이 있었습니다!


처음에는 삽질을 너무 많이하고 이해가 잘 안가는 구조였는데, 제가 멍청했던거여서 포스팅을 합니다 ㅎㅎㅎㅎㅎㅎㅎ 젠장...


제가 짬내서 쓰는거라... 구글 API 등록은 생략할게요 ㅠㅠ 쉽게 찾아보실 수 있을겁니다! 죄송해요!!


#필요한 데이터?

1.클라이언트 아이디

2.클라이언트 시크릿

3.리다이렉트 URL ( 이건 등록해주셔야되요!)


이렇게만 설명드릴게요!


아! 그리고 저는 Laravel을 사용했다고 말씀드렸는데요!!

"google/apiclient": "^2.0",

위와 같이 composer로 라이브러리를 설치해주셔야 사용할 수 있답니다!!!


출처 : https://developers.google.com/api-client-library/php/start/installation


본론으로 들어가서 구글 로그인은 두 가지 방법이 있습니다!


첫번째는 Javascript를 이용한 방법인데요!


우선 소스코드를 먼저 보여드릴게요! (개판입니다.)


#리다이렉트 URL

Route::get('terms','PageController@terms');

var scope = 'email profile openid';
var fetchBasicProfile= 'true';
var includeGrantedScopes = 'true';
var redirectUri = 'http://localhost:8000/terms';
var clientId = '구글 API 등록할 때 받는 아이디';
var responseType = 'code';
var approvalPrompt = 'force';

$('#sign-up-btn').on('click',function() {

location.href='https://accounts.google.com/o/oauth2/v2/auth?'
+'scope='+scope
+'&fetch_basic_profile'+fetchBasicProfile
+'&include_granted_scopes'+includeGrantedScopes
+'&redirect_uri='+redirectUri
+'&response_type='+responseType
+'&client_id='+clientId
+'&approval_prompt='+approvalPrompt;

});


보이시나요? ㅎㅎㅎ 정말개판이죠...?

이렇게 하는게 더 편해보여서 시작했는데...

클라이언트 시크릿이 노출되지 않는다고해도 클라이언트 아이디가 개발자 도구로 아주 쉽게 노출되는 상황이 일어납니다....


//구글 로그인 리다이렉트 페이지
public function terms(Request $request) {


Input::get('code') //이 값으로 지지고 볶기!


}

저기 리다이렉트 페이지 에서 지지고 볶으면 되는데! 뒤에서 설명할거라 이렇게만 보여드릴게요!



캘린더 API를 이용하다가 보니 너무 쉽고 이해가 잘되는 코드가 있어서 로그인 프로세스를 바꿨습니다 ㅎㅎㅎㅎ

(캘린더 API는 다시 안바쁠 때 와서 다시 포스티하겠습니다!!)


그게 바로 두번째 방법인 모든 걸 백단에서 해주는건데요!!!!


$('#sign-up-btn').on('click',function() {
location.href='/google/loginPage';
});


회원가입 버튼을 클릭하면!!!


Route::prefix('google')->group(function () {
Route::get('/loginPage','GoogleController@loginPage');
});


다음 컨트롤러로 가보겠습니다!!!


public function loginPage(Request $request) {
$client = new \Google_Client();

$client->setScopes(
array(
\Google_Service_Oauth2::USERINFO_PROFILE,
\Google_Service_Oauth2::USERINFO_EMAIL
)
);


$client->setClientId($this->CLIENT_ID);
$client->setRedirectUri($this->REDIRECT_URI);
$client->setAccessType('offline');
$client->setPrompt('select_account consent');

$commonLib = new Common();
// If there is no previous token or it's expired.
if ($client->isAccessTokenExpired()) {
// Refresh the token if possible, else fetch a new one.
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
} else {
// Request authorization from the user.
$authUrl = $client->createAuthUrl();
$commonLib->locationHref($authUrl); //여기로 페이지이동!

}
}
}


아직 토큰값이 없으니 당연히 locationHref 메소드로 페이지가 이동되겠죠!!

(아까 프론트단에서 해준 그런 복잡한 url 없이 이동할 수 있답니다!)


//구글 로그인 리다이렉트 페이지
public function terms(Request $request) {

$googleController = new GoogleController();

$googleUserInfo = $googleController->googleLogin($request);

}



리다이렉트 페이지로 와서 구글 컨트롤러의 구글로그인 메소드를 호출합니다.



public function googleLogin(Request $request ) {


$client = $this->getOauthClient($request);

$plus = new \Google_Service_Oauth2($client);

$userData = $plus->userinfo->get();

return json_decode(json_encode($userData),true);

}


헉 너무 간단하죠??? getOauthClient 메소드도 보여드릴게요!!

이 리턴값을 찍어보시면 어떤 데이터들이 오는지 확인하실 수 있습니다!! 

(ㅠㅠ 다음에 시간날 때 보여드릴게요 흑흑... 저는 아직 개발의 노예입니다.... 물론 제가 원해서지만요 ㅎㅎㅎ)



public function getOauthClient(Request $request) {
$client = new \Google_Client();
$client->setScopes(
array(
\Google_Service_Oauth2::USERINFO_PROFILE,
\Google_Service_Oauth2::USERINFO_EMAIL
)

);
$client->setClientId($this->CLIENT_ID);
$client->setClientSecret($this->CLIENT_SECRET);
$client->setRedirectUri($this->REDIRECT_URI);
$client->setAccessType('offline');
$client->setPrompt('select_account consent');

// If there is no previous token or it's expired.
if ($client->isAccessTokenExpired()) {
// Refresh the token if possible, else fetch a new one.
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());

}
else {
// Request authorization from the user.

// Exchange authorization code for an access token.
$authCode = Input::get('code');
$accessToken = $client->fetchAccessTokenWithAuthCode($authCode);
$client->setAccessToken($accessToken);

// Check to see if there was an error.
if (array_key_exists('error', $accessToken)) {
throw new Exception(join(', ', $accessToken));
}
}

}
return $client;
}



구글 클라이언트를 리턴해주는 메소드입니다!!!


이렇게 하시면 리다이렉트 페이지에서 구글 로그인 데이터를 얻으실 수 있습니다!!! 


그럼 저는 또 일을 하러 가봐야 되서 ㅎㅎㅎㅎ


안녕히계세요!!

728x90
반응형

'GoogleAPI' 카테고리의 다른 글

[PHP,Laravel] 구글 로그아웃!  (0) 2019.02.13
Comments