개발 Q&A

제목 안녕하세요 네이버 로그인 세션 처리 관련 질문이 있습니다!
카테고리 PHP
글쓴이 syrup 작성시각 2019/07/09 14:18:05
댓글 : 5 추천 : 0 스크랩 : 0 조회수 : 10702   RSS
<?php
  require ("./cls/login.cls.php");
  $login = new OAuthRequest();
  $login->call_accesstoken();
  $profile = $login->get_user_profile();

  print_r($login->get_userInfo());
?>

안녕하세요 네이버 로그인 기능 활용과 관련하여 질문이 있어 글을 작성하게 되었습니다.

현재 로그인 후 위와 같은 callback과정을 통해 사용자의 정보가 텍스트로 표기되도록 하였는데요.

제가 구상했던 기능은 사용자가 로그인을 하였을 때 사용자의 아이디를 넘겨받고

서버 DB에 저장되어 있는 사용자의 기록(여기에 네이버 아이디값이 포함되어 있습니다)이 창에 나타나도록 하는 것입니다.

현재 기록을 나타내줄 창은 구현을 해두었는데요.

어떻게 하면 사용자의 닉네임값을 세션에 저장하여 이동시킬 수 있는지 명확히 나온곳이 없어서 글을 올렸습니다.

 

 

추가적으로 만약 위의 기능을 통해 사용자의 기록을 담은 창에 진입한 후에,

다른 페이지로 넘어가는 순간 로그아웃이 되도록 할 수도 있을까요??

 다음글 click2call.php 에 관련한 정보를 찾고 있습... (1)
 이전글 이메일(Email) 첨부파일 파일명 인코딩 문제 질문입... (3)

댓글

kaido / 2019/07/09 15:16:32 / 추천 0

어렵게 생각 하실 필요없습니다

네이버에서 전달 받은 값과 DB의 네이버 값을 비교해서 세션에 담아 주시면 됩니다.

input 받은게 page 이냐 curl 이냐의 차이이지, 전달 받고 비교하는건 동일 한겁니다.

 

1회성 세션은 딱 이거다 하는 방법은 없습니다.

세션에 플래시 용도로 별도로 세션값을 담고 체크하는 로직을 구현하셔야 합니다.

 

CI 에서는  플래시 세션 기능이 있어서 간편하게 구현이 됩니다.

$this->session->mark_as_flash('item');

 

라이브러리를 한번 참고해 보시는것도 좋을듯 싶습니다.

syrup / 2019/07/10 13:30:59 / 추천 0

답변 감사합니다 kaido님!

그런데 말씀해주신 것처럼 2개의 값을 비교해서 세션에 담는다는 부분을 적용하려하니 잘 이해가 안되는것 같습니다.

제가 구현하고자 하는 기능의 방식을 설명드리면

callback 과정에서 말씀해주신것처럼 유저의 프로필을 플레시 세션 기능을 활용하여 담아둔 후 

전달받고자 하는 페이지에 redirect를 걸어서 이 페이지에서 전달받은 프로필 중에 아이디 값만 추출하면 되는 느낌인데요

이 과정을 토대로 생각했을때면 callback 쪽에서 값을 비교하는 과정이 불필요한 것 아닌가요??

 

또 여러곳을 찾아본 결과 callback 과정에서 다른 페이지로 넘어가는 방법은 알게 되었는데

정작 질문글 코드에서처럼 유저의 프로필을 받았을때 어떠한 방식으로 세션값에 담을 수 있는건지는 잘 모르겠습니다..

kaido / 2019/07/10 14:44:14 / 추천 0

아무래도 서로 생각하는 로직이 다르고 제가 이해한 질문이 상이했던것 같습니다.

 

요약하면 네이버 oAuth 넘어와서 해당 닉네임을 추츨해서 동일한 값이 있으면 "네이버 아이디값이 포함되어있습니다." 라는 문구가 나타나도록 하는 것인가요?

 

// oauth name call back

$url="https://nid.naver.com/oauth2.0/token?client_id=".NV_CLIENT_ID."&client_secret=".NV_CLIENT_SECRET."&grant_type=authorization_code&state=".$state."&code=".$code;
			$ch=curl_init();
			curl_setopt($ch, CURLOPT_URL, $url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
			$result=curl_exec($ch);
			if($errno = curl_errno($ch)) {
    			$error_message = curl_strerror($errno);
			} else {
				$json=json_decode($result);
				$url="https://openapi.naver.com/v1/nid/getUserProfile.xml";
				$header=array("Authorization: ".$json->{'token_type'}." ".$json->{'access_token'});
				curl_setopt($ch, CURLOPT_URL, $url);
				curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
				curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
				curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
				$result=curl_exec($ch);
				$xml = simplexml_load_string($result);
print_r($xml);
}

 

oauth 기본 callback 프로세스 입니다.

NV_CLIENT_ID
NV_CLIENT_SECRET

 

해당 상수는 네이버 키 값 설정 하시면 됩니다.

받아온 값을 찍어보신다음에 그 이후 로직은 원하시는 대로 진행 하시면 될것 같습니다.

단일성 세션에 대해서는 토큰 개념으로 다가가시면 좋을듯 싶습니다.

syrup / 2019/07/10 15:19:57 / 추천 0

답변 감사합니다 kaido님 제가 질문을 명확하게 하지 못한것 같아 죄송합니다..

구현하고자 하는 기능을 쉽게 설명드리자면

우선 DB에는 유저들의 네이버 아이디와 그에 맞는 정보들이 저장되어 있습니다.

이 정보들을 A라는 페이지에서 접속하는 유저들마다 해당되는 정보들을 확인할 수 있도록 하려는 기능입니다.

마치 음료 자판기(A라는 페이지)에 동전(접속하는 유저들의 네이버 아이디)을 넣었을 때 음료(DB에 저장된 접속한 유저의 정보)가

나오는 구조입니다.

현재 유저들의 정보를 얻는 부분(질문글에 작성된 코드부분입니다)은 완료되었고, 정보들을 나타내줄 A라는 페이지도 구현이 되었는데

접속하려는 유저들의 정보를 A라는 페이지에 넘겨주는 부분에서 막히고 있었습니다...

 

kaido / 2019/07/10 15:26:56 / 추천 0

기본적으로 일회성 세션 이라는 기능은 없습니다.

가령 세션 명의 키값을 naver 이라고 담고 체크 하는 곳에서 세션을 받아갈때 해당 세션을 삭제 하시면 됩니다.

세션은 사실 사라지기 전까지 반영구적인 글로벌 변수이라고 볼수 있으니, 의도와 조금 다르게 느껴질수는 있습니다.

토큰 라이브러리들을 사용해보시면 1회성 으로 데이터를 담아서 넘길수 있습니다.

굳이 비교하자면 email 회원 가입 인증 프로세스하고 비슷하네요.

회원 가입 라이브러리들을 뜯어보시면 어떤 구조로 token을 받는지 알수 있습니다.

사실상 syrup님의 머릿속에서는 이미 답이 나와있고 그걸 어떻게 구현할지 망설이는 정도로 보여서 긴 답변은 불필요할것 같습니다 ^^