구글 아이디로 로그인을 거의 포기했었는데요. https://xetown.com/1368913
... 그 이후에 구글 쪽에 앱 게시 허용 요청 보내고 몇 차례 빠꾸 먹고 겨우 허용을 얻고 그랬는데도 안 되더라구요. 털썩...
그러다 좀 전에 질답게시판에 소셜XE 이야기가 나오기도 해서, 이 참에 진지하게 처음부터 하는 기분으로 다시 시도를 해봤습니다.
... 결과는 아직 성공적입니다. (이후에 또 어떻게 될지 몰라서ㅜ)
암튼 구아로ㅋ 때문에 고생하시는 분들께 도움이 될지 몰라 정리를 다시 해봅니다.
1. 구글 개발자 콘솔에서 '사용자 인증 정보'와 'OAuth 동의 화면'이 모두 잘 설정됐다는 전제입니다.
2. rixx님의 패치는 기본입니다. 이거 설치했구요. https://xetown.com/1196345
3. 제 경우에는 그럼에도 불구하고 "API 통신 오류입니다. 재시도 해주세요."라는 메시지와 함께 관련 오류가 계속 발생했어요.
4. 그래서 ./modules/socialxe/libs 에 있는 google.lib.php 파일을 열어서 해당 문구가 나오는 부분을 찾아봤어요. 'msg_errer_api_connect' 라는 부분입니다. (제작자님 오타가ㅠ)
5. 그래서 이 부분의 메시지를 조금씩 조정해봤더니 if(empty($profile)) 이 부분에서 막힌 거였더라구요. 프로필을 못 가져온다는 이야기겠죠? 그래서 검색을 했죠.
6. 그랬더니 'https://www.googleapis.com/plus/v1/people/me' 라는 부분을 'https://www.googleapis.com/userinfo/v2/me' 로 바꿔줘야 한다는 의견들이 많더라구요. 역시 스택오버플로우 짜응~
7. google.lib.php를 다시 열었습니다.
const GOOGLE_PEOPLE_URI = 'https://www.googleapis.com/plus/v1/people/';
라는 부분이 있더라구요. 안 그래도 이게 좀 찜찜했었어요. 왜냐면 아까 프로필 가져오는 부분에서부터
$profile = $this->requestAPI(GOOGLE_PEOPLE_URI . 'me?' . http_build_query(array( 'access_token' => $this->getAccessToken(), ), '', '&'));
GOOGLE_PEOPLE_URI가 계속 마음에 걸렸었거든요.
그래서 문제의 9행을 다음과 같이 바꿨습니다.
const GOOGLE_PEOPLE_URI = 'https://www.googleapis.com/userinfo/v2/';
8. 그리고 '회원 메뉴'의 'SNS 관리'로 들어가 구글 계정 연결을 재시도해봤습니다. 그랬더니... 해결될 줄 알았죠? ㅋㅋㅋ 이번에는 'name값은 필수입니다'라는 오류 메시지가 뙇!!
9. 어쨌든 이건 프로필은 가져오는데 거기서 name값이 누락된다는 이야기 아니겠습니까? 그래서 다시 google.lib.php를 열었습니다.
$this->setName($profile['displayName']);
분명 name 설정해주는 부분이잖아요? 'displayName'은 아무래도 예전 로그인 방식에서 가져오는 프로필 속성 같더군요. 그래서 더 알아보기 전에 일단 시험이나 해봐야겠다는 생각으로 name이라는 글자를 넣어봤습니다.
$this->setName($profile['name']);
10. 그리고 다시 계정 연결을 시도했습니다. 그랬더니... 하늘색 배경의 성공 메시지가 떴습니다. 'SNS 계정 등록을 완료했습니다.' 이제는 등록 해제하고 다시 등록해도 잘 되고, 다시 등록한 뒤 로그아웃하고 구글 아이디로 로그인해봐도 잘 됩니다.
11(덧). 추가 확인 결과, 위에서처럼 GOOGLE_PEOPLE_URI 정의를 바꾸게 되면 이메일을 받아오는 부분도 바뀌어야 합니다.
// 이메일 주소 if($profile['emails']) { foreach($profile['emails'] as $key => $val) { if($val['type'] == 'account' && $val['value']) { $this->setEmail($val['value']); break; } } }
디버그를 해보니 역시 예전 방식과 다르게 이제는 $profile이 다음과 같이 구성되어 있기 때문에 구글 계정에서 이메일을 가져오지 못했습니다.
Array
(
[id] => ~~~~
[email] => [email protected]
[verified_email] => 1
[name] => 윤삼
[given_name] => 삼
[family_name] => 윤
[picture] => https://~~~~/photo.jpg
[locale] => ko
)
이렇게요.
따라서 위에 나와 있던 코드를 다음과 같이 통째로 바꿔주니까 별 문제 없이 작동하는 것 같습니다.
// 이메일 주소 $this->setEmail($profile['email']);
12(덧). 11번 항목 바로 아래에 보면 다음과 같은 코드가 있는데요.
// ID, 이름, 프로필 이미지, 프로필 URL $this->setId($profile['id']); $this->setName($profile['name']); $this->setProfileImage($profile['image']['url']); $this->setProfileUrl($profile['url']);
위에서 바뀐 소스를 기준으로 하면, 100행부터가 됩니다. 여기서 세 번째에 해당하는 $this->setProfileImage($profile['image']['url']); 을 다음과 같이 바꾸면 프로필 이미지를 가져오는 것도 가능해집니다.
$this->setProfileImage($profile['picture']);
... 그리고 104행의 $this->setProfileUrl($profile['url']); 은 쓸모가 없어졌으니 지워도 무방하겠구요.
그리고 @spire님 참고해보세요. 부디 잘 되시길~