질문/조언질답게시판
Extra Form
PHP PHP 5.4
CMS XpressEngine

주말 잘 보내고 계신지요. 저는 여전히 누리집을 짓는다고  씨름하고 있네요^^

다른 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);
        }
    }

 

  • profile
    사이트상에 겹치는 닉네임이 있지는 않을까요?
  • profile profile
    아하 그렇네요. 제 아이디로 다 실험을 해보니 같은 이름으로 ㅋㅋ
    이 문제를 찾다가
    윤삼님께서 올리신 텔레그램 공유 방법을 보았는데
    저도 해 보려고합니다.

    스케치북 아닌 게시판에도 sns 공유 다 적용 될 수 있는 방법도 연구 해 보고 싶어 지네요ㅎ
    편안한 주말 보내세요^^
  • profile profile
    그건 워낙 예전인 데다 뭣 모르던 시절인지라...
    잘 되시면 팁 공유도 부탁드려용~
  • profile profile

    아네 그런데
     

    <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()}" />


    이 건 어디에 넣어야 하는 걸까요?

  • profile profile
    그거는 제가 뭣모르던 시절에 수동으로 했던 건데요ㅋㅋ
    보통은 SEO 모듈 등에서 메타 태그 생성을 지원해줄 겁니다.
    라이믹스에서는 별도 모듈 설치 안해도 기본으로 지원하는 기능이구요.
  • profile profile
    아네 제목 등 다 들어 가는데 이미지는 바로 보이지가 않네요.
    이미지까지 보이면 좋을텐데..
  • profile profile

    썸네일이 메타태그(중에서도 og)로 안 들어간다면 썸네일 생성방식에 문제가 있어서 그런 걸 수 있어요.
    보통 첨부 파일의 이미지인지, 첨부 이미지가 본문에 삽입되어 있는지, 첨부 파일 이미지가 아니라 외부 이미지인지 등에 따라 썸네일 생성이 안 되는 경우가 있을 수 있거든요.
    가급적 PHP 7.0 이상에 라이믹스 최신 master 버전 사용을 추천드립니다.
    그러면 그 모든 이슈가 한방에 해결, 일 걸요..

  • profile profile
    아네 외부 파일이 아닌데도 들어 가지 않네요.
    xe를 사용중이라 바꾸기엔 엄청 부담되네요. 지금도 눈 아프게 삽질 중이라 ㅎㅎ
  • profile profile
    네, 어차피 라이믹스면 php 버전업도 하셔야 하니ㅎㅎ
    나중에라도 큰 맘 먹고 바꿔보세요. 정말 좋습니다 :)
  • profile profile
    ㅎㅎ 네 글쿤요.
    2005년에 티보드로 만들고 2009년에 그루보드로 만들고
    이제서야 모바일에 대응하는 홈피를 만들고 있네요^^
  • profile profile
    아 텔레그램 공유 pc 에서도 하려고 적용해 보니 텔레그램을 열겠나는 창이 나오고 오케이 누르면 텔레그램이 열리는데 내용이 들어가지가 않네요.
    그리고 모바일에서 공유가 되긴 하는데 글 뒤에 홈페이지 제목이 또 붙어지는데 삭제 할순 없을까요?
    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>
  • profile profile
    저도 헷갈리는데 해당 url을 텔레그램에 공유했을 때 프리뷰 화면 좀 보여주시겠어요?
  • profile profile

    주석 2020-04-26 000519.jpg

    이렇게 나오고요.
    모바일로 공유하면

    주석 2020-04-26 000726.jpg

    요로코롬 나와요

  • profile profile

    20200426_004540.jpg

    위의 그림은 사이트의 텔레그램 버튼으로 공유한 거구요, 아래 그림은 폰 자체의 공유 기능을 이용한 겁니다.

    비교해본 결과, seo가 그렇게 맞추진 게 아닌가 싶어요. 글 제목을 내보낼 때,

    문서 제목 - 게시판 제목 - 사이트 제목

    이런 식으로 나가게끔요.

  • profile profile
    아네 그렇군요 여러번 테스트를 해보니 마지막 부분은 나오지 않네요 감사합니다^^
    홈피용 텔레그램 공유는 어찌 안될까요?ㅎ
  • profile profile

    링크를 이걸로 대체하면 어떻게 되나요?
    최신 팁들을 보니까 이런 형식의 얘기들이 있더라구요.
    <a href="https://telegram.me/share/url?url={$oDocument->getPermanentUrl()}&text={htmlspecialchars($sns_title)}">

     

    아 이게 링크url에 쿼리스트링(물음표 이후 &로 이뤄진 부분요) 이 있으면 주소 전달이 안 되는 문제가 있네요.

  • profile profile
    아네 그래도 일단 함 적용해 볼게요^^
  • profile profile

    이렇게 수정을 했습니다.
    <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>

    주석 2020-04-26 110317.jpg



     되긴 하는데  본문 창이 이렇게 바뀌어 버리네요. 좀만 어찌 하면 될 거 같은데 ㅎㅎ
    이제 공유된 내용이 자동으로 들어가긴 합니다^^
     

  • profile profile

    아마 텔레그램 사이트를 거쳐서 링크 프리뷰가 공유되는 프로세스여서 그런 것 같아요.


    아, 현재 창에서 그렇게 된다는 말씀인가요?
    그렇다면 모바일 버전이 아닐 경우에 한해 새 창을 띄우면 되지 않을까요?

    <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>

  • profile profile

    아네^^
    공유한 후에 닫아 버리면 되니깐 ㅎ
    방금 적용해 보았는데 잘 되네요.
    도움 주셔서 고맙습니다.
    홍익인간이세요 ㅋㅋ

    삶에서 주름잡으시길요~
    http://dunun.org/board_uJpX25/1758

  • profile profile
    네, 내면의 주름을!!
  • profile profile
    네 주말엔 내면에 주름잡기 딱 좋지요:)
    출출해 지내요 식사 맛있게 하세요~