sns 구글 로그인 시 이름에 숫자가 붙어요
CMS/프레임워크 | XE 1.x |
---|---|
개발 언어 | PHP 5.x |
문제 페이지 주소 | 비공개 (작성 후 5일 경과) |
주말 잘 보내고 계신지요. 저는 여전히 누리집을 짓는다고 씨름하고 있네요^^
다른 sns는 아무 문제 없이 로그인이 되는데
구글만 이름 뒤에 숫자가 붙네요. 뭐가 잘못 된 걸까요?
// ID, 이름, 프로필 이미지, 프로필 URL
$this->setId($profile['id']);
$this->setName($profile['name']);
$this->setProfileImage($profile['picture']);
$this->setProfileUrl($profile['url']);
// 프로필 인증
$this->setVerified(true);
// 전체 데이터
$this->setProfileEtc($profile);
return new Object();
}
-------------------------------
전체 구글 소스
<?php
/**
* @class libraryGoogle
* @author CONORY (https://xe.conory.com)
* @brief The google library of the socialxe module
*/
const GOOGLE_OAUTH2_URI = 'https://accounts.google.com/o/oauth2/';
const GOOGLE_PEOPLE_URI = 'https://www.googleapis.com/userinfo/v2/';
class libraryGoogle extends socialxeLibrary
{
/**
* @brief 인증 URL 생성 (SNS 로그인 URL)
*/
function createAuthUrl($type)
{
// API 권한
$scope = array(
'https://www.googleapis.com/auth/userinfo.email',
'https://www.googleapis.com/auth/userinfo.profile',
);
// 요청 파라미터
$params = array(
'scope' => implode(' ', $scope),
'access_type' => 'offline',
'response_type' => 'code',
'client_id' => $this->config->google_client_id,
'redirect_uri' => getNotEncodedFullUrl('', 'module', 'socialxe', 'act', 'procSocialxeCallback', 'service', 'google'),
'state' => $_SESSION['socialxe_auth']['state'],
);
return GOOGLE_OAUTH2_URI . 'auth?' . http_build_query($params, '', '&');
}
/**
* @brief 인증 단계 (로그인 후 callback 처리) [실행 중단 에러를 출력할 수 있음]
*/
function authenticate()
{
// 위변조 체크
if(!Context::get('code') || Context::get('state') !== $_SESSION['socialxe_auth']['state'])
{
return new Object(-1, 'msg_invalid_request');
}
// API 요청 : 엑세스 토큰
$token = $this->requestAPI('token', array(
'code' => Context::get('code'),
'grant_type' => 'authorization_code',
'client_id' => $this->config->google_client_id,
'client_secret' => $this->config->google_client_secret,
'redirect_uri' => getNotEncodedFullUrl('', 'module', 'socialxe', 'act', 'procSocialxeCallback', 'service', 'google'),
));
// 토큰 삽입
$this->setAccessToken($token['access_token']);
$this->setRefreshToken($token['refresh_token']);
return new Object();
}
/**
* @brief 로딩 단계 (인증 후 프로필 처리) [실행 중단 에러를 출력할 수 있음]
*/
function loading()
{
// 토큰 체크
if(!$this->getAccessToken())
{
return new Object(-1, 'msg_errer_api_connect');
}
// API 요청 : 프로필
$profile = $this->requestAPI(GOOGLE_PEOPLE_URI . 'me?' . http_build_query(array(
'access_token' => $this->getAccessToken(),
), '', '&'));
// 프로필 데이터가 없다면 오류
if(empty($profile))
{
return new Object(-1, 'msg_errer_api_connect');
}
// 팔로워 수 제한
if($this->config->sns_follower_count)
{
if($this->config->sns_follower_count > $profile['circledByCount'])
{
$this->revokeToken();
return new Object(-1, sprintf(Context::getLang('msg_not_sns_follower_count'), $this->config->sns_follower_count));
}
}
// 이메일 주소
$this->setEmail($profile['email']);
{
foreach($profile['emails'] as $key => $val)
{
if($val['type'] == 'account' && $val['value'])
{
$this->setEmail($val['value']);
break;
}
}
}
// ID, 이름, 프로필 이미지, 프로필 URL
$this->setId($profile['id']);
$this->setName($profile['name']);
$this->setProfileImage($profile['picture']);
$this->setProfileUrl($profile['url']);
// 프로필 인증
$this->setVerified(true);
// 전체 데이터
$this->setProfileEtc($profile);
return new Object();
}
/**
* @brief 토큰 파기 (SNS 해제 또는 회원 삭제시 실행)
*/
function revokeToken()
{
// 토큰 체크
if(!($token = $this->getRefreshToken() ?: $this->getAccessToken()))
{
return;
}
// API 요청 : 토큰 파기
$this->requestAPI('revoke', array(
'token' => $token,
));
}
/**
* @brief 토큰 새로고침 (로그인 지속이 되어 토큰 만료가 될 경우를 대비)
*/
function refreshToken()
{
// 토큰 체크
if(!$this->getRefreshToken())
{
return;
}
// API 요청 : 토큰 새로고침
$token = $this->requestAPI('token', array(
'refresh_token' => $this->getRefreshToken(),
'grant_type' => 'refresh_token',
'client_id' => $this->config->google_client_id,
'client_secret' => $this->config->google_client_secret,
));
// 새로고침 된 토큰 삽입
$this->setAccessToken($token['access_token']);
}
/**
* @brief 프로필 확장 (가입시 추가 기입)
*/
function getProfileExtend()
{
// 프로필 체크
if(!$profile = $this->getProfileEtc())
{
return new stdClass;
}
$extend = new stdClass;
// 서명 (자기 소개)
if($profile['aboutMe'] || $profile['tagline'])
{
$extend->signature = $profile['aboutMe'] ?: $profile['tagline'];
}
// 홈페이지
if($profile['urls'])
{
foreach($profile['urls'] as $key => $val)
{
if($val['type'] == 'other' && $val['value'])
{
$extend->homepage = $val['value'];
break;
}
}
}
// 생일
if($profile['birthday'])
{
$extend->birthday = preg_replace('/[^0-9]*?/', '', $profile['birthday']);
}
// 성별
if($profile['gender'] == 'male')
{
$extend->gender = '남성';
}
else if($profile['gender'] == 'female')
{
$extend->gender = '여성';
}
// 연령대
if($profile['ageRange']['min'] || $profile['ageRange']['max'])
{
if($profile['ageRange']['min'] && $profile['ageRange']['max'])
{
$age = ($profile['ageRange']['min'] + $profile['ageRange']['max']) / 2;
}
else
{
$age = max($profile['ageRange']['min'], $profile['ageRange']['max']);
}
$extend->age = floor($age / 10) * 10 . '대';
}
return $extend;
}
function getProfileImage()
{
// 최대한 큰 사이즈의 프로필 이미지를 반환하기 위하여
return preg_replace('/\?.*/', '', parent::getProfileImage());
}
function requestAPI($url, $post = array())
{
return json_decode(FileHandler::getRemoteResource(
in_array($url, array('token', 'revoke')) ? GOOGLE_OAUTH2_URI . $url : $url,
null,
3,
empty($post) ? 'GET' : 'POST',
'application/x-www-form-urlencoded',
array(),
array(),
$post,
array('ssl_verify_peer' => false)
), true);
}
}
댓글 22
이 문제를 찾다가
윤삼님께서 올리신 텔레그램 공유 방법을 보았는데
저도 해 보려고합니다.
스케치북 아닌 게시판에도 sns 공유 다 적용 될 수 있는 방법도 연구 해 보고 싶어 지네요ㅎ
편안한 주말 보내세요^^
잘 되시면 팁 공유도 부탁드려용~
아네 그런데
<meta property="og:site_name" content="사이트 이름" />
<meta property="og:title" content="{$mi->title} ::: {htmlspecialchars($sns_title)}" /> <!--//스케치북 게시판에서 별도로 지정한 변수로 mid 제목과 문서 제목을 의미합니다.-->
<meta property="og:type" content="website" />
<meta property="og:url" content="{$oDocument->getPermanentUrl()}" />
<meta property="og:description" content="{htmlspecialchars($oDocument->getSummary(150))}" /> <!--// 괄호 안의 숫자는 공유되는 본문 글자 수를 의미합니다.-->
<meta property="og:image" content="{$oDocument->getThumbnail()}" />
이 건 어디에 넣어야 하는 걸까요?
보통은 SEO 모듈 등에서 메타 태그 생성을 지원해줄 겁니다.
라이믹스에서는 별도 모듈 설치 안해도 기본으로 지원하는 기능이구요.
이미지까지 보이면 좋을텐데..
썸네일이 메타태그(중에서도 og)로 안 들어간다면 썸네일 생성방식에 문제가 있어서 그런 걸 수 있어요.
보통 첨부 파일의 이미지인지, 첨부 이미지가 본문에 삽입되어 있는지, 첨부 파일 이미지가 아니라 외부 이미지인지 등에 따라 썸네일 생성이 안 되는 경우가 있을 수 있거든요.
가급적 PHP 7.0 이상에 라이믹스 최신 master 버전 사용을 추천드립니다.
그러면 그 모든 이슈가 한방에 해결, 일 걸요..
xe를 사용중이라 바꾸기엔 엄청 부담되네요. 지금도 눈 아프게 삽질 중이라 ㅎㅎ
나중에라도 큰 맘 먹고 바꿔보세요. 정말 좋습니다 :)
2005년에 티보드로 만들고 2009년에 그루보드로 만들고
이제서야 모바일에 대응하는 홈피를 만들고 있네요^^
그리고 모바일에서 공유가 되긴 하는데 글 뒤에 홈페이지 제목이 또 붙어지는데 삭제 할순 없을까요?
http://dunun.org/2336
----------------------
알려주신 소스
_read_sns
<a class="{$mi->to_sns_small}" href="tg://msg?text={htmlspecialchars($sns_title)}%0D%0A{$oDocument->getPermanentUrl()}" title="To Telegram"><i class="ico_sns16 telegram"></i><strong> Telegram</strong></a>
_read
<a class="telegram bubble" href="tg://msg?text={htmlspecialchars($sns_title)}%0D%0A{$oDocument->getPermanentUrl()}" title="To Telegram"><b class="ico_sns telegram">Telegram</b></a>
이렇게 나오고요.
모바일로 공유하면
요로코롬 나와요
위의 그림은 사이트의 텔레그램 버튼으로 공유한 거구요, 아래 그림은 폰 자체의 공유 기능을 이용한 겁니다.
비교해본 결과, seo가 그렇게 맞추진 게 아닌가 싶어요. 글 제목을 내보낼 때,
문서 제목 - 게시판 제목 - 사이트 제목
이런 식으로 나가게끔요.
홈피용 텔레그램 공유는 어찌 안될까요?ㅎ
링크를 이걸로 대체하면 어떻게 되나요?
최신 팁들을 보니까 이런 형식의 얘기들이 있더라구요.
<a href="https://telegram.me/share/url?url={$oDocument->getPermanentUrl()}&text={htmlspecialchars($sns_title)}">
아 이게 링크url에 쿼리스트링(물음표 이후 &로 이뤄진 부분요) 이 있으면 주소 전달이 안 되는 문제가 있네요.
이렇게 수정을 했습니다.
<a class="{$mi->to_sns_small}" href="https://telegram.me/share/url?url={$oDocument->getPermanentUrl()}&text={htmlspecialchars($sns_title)}" title="To Telegram"><i class="ico_sns16 telegram"></i><strong> Telegram</strong></a>
되긴 하는데 본문 창이 이렇게 바뀌어 버리네요. 좀만 어찌 하면 될 거 같은데 ㅎㅎ
이제 공유된 내용이 자동으로 들어가긴 합니다^^
아마 텔레그램 사이트를 거쳐서 링크 프리뷰가 공유되는 프로세스여서 그런 것 같아요.
아, 현재 창에서 그렇게 된다는 말씀인가요?
그렇다면 모바일 버전이 아닐 경우에 한해 새 창을 띄우면 되지 않을까요?
<a class="{$mi->to_sns_small}" href="https://telegram.me/share/url?url={$oDocument->getPermanentUrl()}&text={htmlspecialchars($sns_title)}" title="To Telegram" target="_blank"|cond="!Mobile::isMobileCheckByAgent()"><i class="ico_sns16 telegram"></i><strong> Telegram</strong></a>
아네^^
공유한 후에 닫아 버리면 되니깐 ㅎ
방금 적용해 보았는데 잘 되네요.
도움 주셔서 고맙습니다.
홍익인간이세요 ㅋㅋ
삶에서 주름잡으시길요~
http://dunun.org/board_uJpX25/1758
출출해 지내요 식사 맛있게 하세요~