일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Vue
- ubuntu
- python
- Cordova
- 안드로이드
- php
- mac
- MacOS
- https
- 해시키
- node
- flutter
- alb
- MYSQL
- pip
- 구글 API
- window
- OAuth
- nginx
- Android
- Prometheus
- selenium
- AWS
- Vue.js
- FCM
- Passport
- Laravel
- 파이썬
- PostgreSQL
- SSH
- Today
- Total
print( sjw.iq == 200) output : true
[PHP,Laravel] 구글 로그인 본문
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;
}
구글 클라이언트를 리턴해주는 메소드입니다!!!
이렇게 하시면 리다이렉트 페이지에서 구글 로그인 데이터를 얻으실 수 있습니다!!!
그럼 저는 또 일을 하러 가봐야 되서 ㅎㅎㅎㅎ
안녕히계세요!!
'GoogleAPI' 카테고리의 다른 글
[PHP,Laravel] 구글 로그아웃! (0) | 2019.02.13 |
---|