회원가입 | 고객센터 |
DESIGNONEX
dxcms.kr
로그인 회원가입
고객센터
11. 인증 / 로그인 시스템

소셜 로그인

D DX
2026.05.10 16:10(수정됨) 126 0

1장. 소셜 로그인 개요

DXCMS는 카카오, 네이버, 구글, GitHub 4가지 소셜 로그인을 기본으로 지원합니다. OAuth 2.0 Authorization Code Flow를 사용하며, DxSocialAuth 클래스 하나에 모든 로직이 집약되어 있습니다. 소셜 계정으로 로그인하면 기존 회원과 자동 매핑되거나 신규 계정이 생성됩니다.


1.1 지원 프로바이더

프로바이더 색상 필요 권한(scope) 콜백 URL
카카오 #FEE500 (검정 텍스트) 기본 (profile, account_email) {site_url}/auth/kakao_callback
네이버 #03C75A (흰 텍스트) 기본 (id, email, nickname) {site_url}/auth/naver_callback
구글 #ffffff (회색 텍스트) openid email profile {site_url}/auth/google_callback
GitHub #24292e (흰 텍스트) user:email {site_url}/auth/github_callback


1.2 관련 파일

파일 역할
core/DxSocialAuth.php 소셜 로그인 핵심 클래스. OAuth URL 생성, 토큰 교환, 사용자 정보 획득, 회원 매핑
core/auth/_social_common.php dx_social_start() + dx_social_callback() 공통 함수 정의
core/auth/{provider}.php dx_social_start("{provider}") 호출. 예: kakao.php, naver.php
core/auth/{provider}_callback.php dx_social_callback("{provider}") 호출. 예: kakao_callback.php
core/auth/social.php 하위 호환 래퍼. /auth/social?provider=kakao → /auth/kakao 리다이렉트
core/auth/_social_notice.php 오류/안내 화면 템플릿. 콜백 URL, 체크리스트 표시


2장. 전체 OAuth 2.0 흐름


2.1 Authorization Code Flow

[사용자가 "카카오로 로그인" 버튼 클릭]
    ↓ /auth/kakao 접속

① dx_social_start("kakao")
   ├ 설정 확인 (enabled, client_id, client_secret)
   ├ redirect URL 세션 저장 ($_SESSION["dx_oauth_redirect"])
   ├ state 생성: "kakao_" + 32자 랜덤hex → $_SESSION["dx_oauth_state"]
   └ 카카오 인증 URL로 리다이렉트
       https://kauth.kakao.com/oauth/authorize
         ?client_id={CLIENT_ID}
         &redirect_uri={site_url}/auth/kakao_callback
         &response_type=code
         &state={state}

[카카오 로그인 페이지에서 사용자 동의]
    ↓ 카카오 → {site_url}/auth/kakao_callback?code=xxx&state=yyy

② dx_social_callback("kakao")
   ├ error 파라미터? → 취소 메시지 + 로그인으로
   ├ code 없음? → 오류 화면
   ├ state 검증: $_SESSION["dx_oauth_state"] vs GET state
   │   불일치 + 세션 살아있음 → CSRF 차단
   │   세션 만료 → 경고만 남기고 계속 진행
   └ DxSocialAuth::handleCallback("kakao", $code, $state)

③ handleCallback() 내부
   ├ fetchToken(): code → 액세스 토큰 교환
   │   POST https://kauth.kakao.com/oauth/token
   │   Body: code, client_id, client_secret, redirect_uri, grant_type
   └ fetchUserInfo(): 액세스 토큰 → 사용자 정보
       GET https://kapi.kakao.com/v2/user/me
       Authorization: Bearer {access_token}
       → provider_id, email, name, profile_img 추출

④ loginOrRegister("kakao", $userInfo)
   ├ Case 1: dx_social_accounts에 provider+provider_id 일치 → 기존 회원 로그인
   ├ Case 2: 이메일 일치 회원 있음 → 기존 회원에 소셜 연결 추가 후 로그인
   └ Case 3: 신규 회원 → INSERT dx_members + INSERT dx_social_accounts

⑤ Auth::loginById($memberId)
   → 세션 생성 + Remember Me 쿠키 발급

⑥ 리다이렉트
   → $_SESSION["dx_oauth_redirect"] (저장된 원래 URL) 또는 홈


2.2 state 검증 (CSRF 방어)

OAuth 공격(CSRF) 방지를 위해 state 파라미터를 사용합니다. 세션에 저장한 state와 콜백으로 돌아온 state를 비교합니다.
// 로그인 시작 시 state 생성
$state = "kakao_" . Secure::randomHex(32);
$_SESSION["dx_oauth_state"] = $state;

// 콜백에서 검증
$sessionState = $_SESSION["dx_oauth_state"] ?? "";
unset($_SESSION["dx_oauth_state"]);

if ($state && $sessionState && $state !== $sessionState) {
    // 세션이 살아있는데 state가 다름 → CSRF 가능성 → 차단
    return ["success"=>false, "message"=>"OAuth state 불일치. 다시 시도해주세요."];
}
// 세션이 만료되어 sessionState가 비어있으면 → 경고만 남기고 계속 진행
// (세션 만료 환경에서도 소셜 로그인이 동작하도록 설계)


3장. 관리자 설정 방법


3.1 설정 전 필수 확인 사항

  • site_url 설정 — 관리자 → 사이트 설정 → 사이트 URL을 정확히 입력. 콜백 URL 생성의 기준이 됨
  • PHP cURL 확장 — phpinfo()에서 curl 활성화 여부 확인. 없으면 소셜 로그인 불가
  • HTTPS 권장 — 카카오/네이버는 HTTPS 콜백 URL을 강제하지 않지만 구글은 필수


3.2 관리자 소셜 로그인 설정 화면

  1. 관리자 → 소셜 로그인 메뉴 클릭
  2. 사용할 프로바이더 탭 선택 (카카오 / 네이버 / 구글 / GitHub)
  3. 활성화 토글 ON
  4. Client ID 입력
  5. Client Secret 입력
  6. "저장" 버튼 클릭
  7. 콜백 URL 확인 — 개발자 콘솔에 이 URL을 등록해야 함

⚠️ Client Secret 마스킹 주의
저장된 Client Secret은 "●●●●●●" 형태로 마스킹되어 표시됩니다.
마스킹된 값을 그대로 저장하면 실제 인증에 실패합니다.
DxSocialAuth::getConfig()에서 마스킹 문자(●) 감지 시 자동으로 무효 처리합니다.
수정이 필요할 때만 새 값을 입력하고, 변경 없이 다른 설정만 저장할 때는 Secret 필드를 비워두세요.


3.3 콜백 URL 확인

관리자 소셜 로그인 설정 화면에서 각 프로바이더의 콜백 URL을 확인할 수 있습니다. 이 URL을 각 개발자 콘솔에 등록해야 합니다.
// DxSocialAuth::callbackUrl($provider) 생성 방식
$base = rtrim(dx_base_url(), "/");
return $base . "/auth/" . $provider . "_callback";

// 예시 (site_url = https://mysite.com)
kakao  → https://mysite.com/auth/kakao_callback
naver  → https://mysite.com/auth/naver_callback
google → https://mysite.com/auth/google_callback
github → https://mysite.com/auth/github_callback

// 서브디렉토리 설치 예시 (site_url = https://mysite.com/cms)
kakao  → https://mysite.com/cms/auth/kakao_callback


4장. 프로바이더별 개발자 콘솔 설정


4.1 카카오 로그인 설정

카카오 개발자 콘솔(developers.kakao.com)에서 앱을 생성하고 설정합니다.
  1. https://developers.kakao.com 접속 → 로그인 → 내 애플리케이션 → 애플리케이션 추가
  2. 앱 이름, 사업자명, 앱 아이콘 입력 후 저장
  3. 앱 키 탭 → "REST API 키" 복사 → DXCMS Client ID에 붙여넣기
  4. 카카오 로그인 메뉴 → 활성화 설정 ON
  5. 카카오 로그인 → Redirect URI → https://{도메인}/auth/kakao_callback 등록
  6. 동의항목 → "닉네임", "카카오계정(이메일)" 필수 동의 또는 선택 동의로 설정
  7. 보안 → Client Secret → 코드 생성 → 코드 활성화 → 코드 복사 → DXCMS Client Secret 입력

💡 카카오 Client Secret 주의
카카오는 Client Secret 사용이 선택사항입니다.
Client Secret을 생성하면 보안이 강화되지만, 반드시 DXCMS에도 동일하게 입력해야 합니다.
Client Secret 없이 사용하려면 DXCMS Client Secret 필드를 비워두고 저장하세요.
단, Client Secret 없이 사용하면 토큰 탈취 위험이 있으므로 운영 환경에서는 설정 권장.


4.2 네이버 로그인 설정

네이버 개발자 센터(developers.naver.com)에서 애플리케이션을 등록합니다.
  1. https://developers.naver.com 접속 → 로그인 → Application → 애플리케이션 등록
  2. 애플리케이션 이름 입력
  3. 사용 API → "네아로(네이버 아이디로 로그인)" 선택
  4. 권한: "이메일 주소", "닉네임", "프로필 사진" 필수 체크
  5. 서비스 URL → https://{도메인} 입력
  6. Callback URL → https://{도메인}/auth/naver_callback 입력
  7. 등록 완료 → Client ID, Client Secret 확인 → DXCMS에 입력


4.3 구글 로그인 설정

Google Cloud Console(console.cloud.google.com)에서 OAuth 2.0 클라이언트를 생성합니다.
  1. https://console.cloud.google.com 접속 → 프로젝트 생성 또는 선택
  2. API 및 서비스 → OAuth 동의 화면 → 외부 선택 → 앱 이름, 이메일 입력
  3. 범위(Scope) 추가: openid, email, profile
  4. API 및 서비스 → 사용자 인증 정보 → 사용자 인증 정보 만들기 → OAuth 클라이언트 ID
  5. 애플리케이션 유형: 웹 애플리케이션 선택
  6. 승인된 리디렉션 URI → https://{도메인}/auth/google_callback 추가 (HTTPS 필수)
  7. 생성 후 클라이언트 ID, 클라이언트 보안 비밀번호 복사 → DXCMS 입력

⚠️ 구글 주의사항
Redirect URI는 반드시 HTTPS여야 합니다. HTTP는 구글 OAuth에서 거부됩니다.
테스트 중에는 OAuth 동의 화면 → "테스트 사용자"에 테스트 계정을 추가해야 합니다.
"게시" 상태가 아니면 테스트 사용자만 로그인 가능합니다.
승인된 리디렉션 URI에 끝 슬래시(/) 포함 여부도 정확히 일치해야 합니다.


4.4 GitHub 로그인 설정

GitHub Developer Settings(github.com/settings/developers)에서 OAuth App을 생성합니다.
  1. https://github.com/settings/developers 접속 → OAuth Apps → New OAuth App
  2. Application name: 앱 이름 입력
  3. Homepage URL: https://{도메인} 입력
  4. Authorization callback URL: https://{도메인}/auth/github_callback 입력
  5. Register application → Client ID 확인
  6. Generate a new client secret → Client Secret 복사 (한 번만 표시됨!)
  7. DXCMS 관리자 → 소셜 로그인 → GitHub에 Client ID, Client Secret 입력

💡 GitHub 이메일 처리
GitHub에서 이메일을 비공개로 설정한 경우 /user/emails API를 추가 호출하여
primary + verified 이메일을 찾습니다.
GitHub 이메일이 없으면 {login_id}@social.local 형식의 임시 이메일이 생성됩니다.
이 임시 이메일로는 실제 이메일 발송이 불가능하므로, 회원에게 이메일 업데이트를 안내하세요.


5장. 회원 매핑 로직 (loginOrRegister)

소셜 로그인 성공 후 DXCMS 회원과 연결하는 핵심 로직입니다. 세 가지 케이스로 처리됩니다.


5.1 3가지 케이스

케이스 조건 처리
Case 1 dx_social_accounts에 provider+provider_id 존재 기존 연결 회원 찾아서 바로 로그인. last_login, last_ip, social_accounts.last_login 업데이트
Case 2 dx_social_accounts에 없지만 같은 이메일 회원 존재 기존 이메일 회원에 소셜 계정 연결(linkAccount) + 로그인. 이후부터는 Case 1으로 처리됨
Case 3 dx_social_accounts도 없고 이메일 일치 회원도 없음 신규 회원 INSERT + 소셜 계정 연결 + 로그인 (is_new=true)


5.2 신규 회원 생성 상세 (Case 3)

// 이름(name) 처리
$name = $userInfo["name"] ?: ($provider . "_" . substr($provId, 0, 6));
// 소셜에서 이름이 없으면 "kakao_abc123" 형식 사용

// login_id 생성 (중복 방지 자동 처리)
$baseId  = $provider . "_" . substr(preg_replace("/[^a-z0-9]/i","", $provId), 0, 12);
// 예: "kakao_1234567890"
$loginId = $baseId;
$suffix  = 1;
while ($db->exists("members", ["login_id" => $loginId])) {
    $loginId = $baseId . $suffix++; // 중복이면 "kakao_12345678901" 등
}

// 이메일 처리
if ($email && $db->exists("members", ["email" => $email])) {
    $email = ""; // 이미 사용 중인 이메일이면 무효화
}
if (!$email) {
    $email = $loginId . "@social.local"; // 임시 이메일
}

// INSERT dx_members
INSERT INTO dx_members (
    login_id, password,              // login_id: 소셜ID 기반, password: 랜덤 BCrypt
    name, email, role, status,
    point, exp, level,
    profile_img,
    join_date, last_login, last_ip
) VALUES (?, ?, ?, ?, "member", 1, 0, 0, 1, ?, NOW(), NOW(), ?)

// 비밀번호: password_hash(Secure::randomHex(32), PASSWORD_BCRYPT)
// → 32자 랜덤 hex로 생성 → 소셜 회원은 비밀번호 로그인 불가
// → 비밀번호 변경은 마이페이지에서 새 비밀번호 설정 필요


5.3 소셜 계정 연결 (linkAccount)

// dx_social_accounts INSERT (ON DUPLICATE KEY UPDATE)
INSERT INTO dx_social_accounts
    (member_id, provider, provider_id, email, name, profile_img, access_token, created_at, last_login)
VALUES (?, ?, ?, ?, ?, ?, "", NOW(), NOW())
ON DUPLICATE KEY UPDATE
    member_id=VALUES(member_id),
    email=VALUES(email),
    name=VALUES(name),
    profile_img=VALUES(profile_img),
    last_login=NOW()

// UNIQUE KEY: (provider, provider_id)
// → 같은 소셜 계정이 중복 연결되지 않음
// → 재연결 시 정보만 업데이트


6장. 각 프로바이더 사용자 정보 획득


6.1 카카오

// API: GET https://kapi.kakao.com/v2/user/me
// Header: Authorization: Bearer {access_token}

// 응답 구조
{
  "id": 1234567890,                      // provider_id
  "kakao_account": {
    "email": "user@example.com",         // 이메일 (동의 시)
    "profile": {
      "nickname": "홍길동",               // name
      "profile_image_url": "https://..." // profile_img
    }
  },
  "properties": {                        // 구형 API 호환 폴백
    "nickname": "홍길동",
    "profile_image": "https://..."
  }
}


6.2 네이버

// API: GET https://openapi.naver.com/v1/nid/me
// Header: Authorization: Bearer {access_token}

// 응답 구조
{
  "resultcode": "00",
  "response": {
    "id": "xxxxxxxxxxx",         // provider_id
    "email": "user@naver.com",   // email
    "nickname": "홍길동",         // name (nickname 우선, 없으면 name)
    "profile_image": "https://..." // profile_img
  }
}


6.3 구글

// API: GET https://www.googleapis.com/oauth2/v3/userinfo
// Header: Authorization: Bearer {access_token}

// 응답 구조
{
  "sub": "123456789",           // provider_id (Google 내부 고유 ID)
  "email": "user@gmail.com",    // email
  "name": "홍 길동",             // name
  "picture": "https://..."      // profile_img
}


6.4 GitHub

// 1차 API: GET https://api.github.com/user
// Header: Authorization: token {access_token}
//         User-Agent: DXCMS-Board/1.2.3

{
  "id": 12345678,              // provider_id
  "login": "username",         // login_id 생성에 사용
  "name": "홍길동",             // name (없으면 login 사용)
  "email": "user@example.com", // 공개 이메일 (없으면 2차 조회)
  "avatar_url": "https://..."  // profile_img
}

// 2차 API: GET https://api.github.com/user/emails
// (email이 null일 때 비공개 이메일 조회)
[
  { "email": "user@example.com", "primary": true, "verified": true }
]
// primary=true AND verified=true인 첫 번째 이메일 사용


7장. dx_social_accounts 테이블


7.1 테이블 구조

컬럼 타입 설명
id INT UNSIGNED PK (AUTO_INCREMENT)
member_id INT UNSIGNED dx_members.id. 연결된 DXCMS 회원 ID
provider VARCHAR(30) "kakao" | "naver" | "google" | "github"
provider_id VARCHAR(191) 소셜 서비스의 사용자 고유 ID
email VARCHAR(191) 소셜 계정의 이메일 (없을 수 있음)
name VARCHAR(100) 소셜 계정의 이름/닉네임
profile_img VARCHAR(500) 소셜 프로필 이미지 URL
access_token TEXT 액세스 토큰 (현재 빈 문자열로 저장 — 보안상 미보관)
created_at DATETIME 최초 연결 일시
last_login DATETIME 이 소셜 계정으로 마지막 로그인한 시각

💡 UNIQUE KEY (provider, provider_id)
같은 소셜 계정을 여러 DXCMS 회원에 중복 연결할 수 없습니다.
INSERT ON DUPLICATE KEY UPDATE로 재연결 시 정보만 업데이트합니다.
회원 한 명이 여러 소셜 계정을 연결하면 provider별로 각각 레코드가 생성됩니다.


8장. cURL HTTP 통신 및 SSL 처리


8.1 통신 방식

DxSocialAuth는 cURL을 사용하여 소셜 서버와 통신합니다. cURL이 없으면 소셜 로그인이 불가합니다.
 
설정
Timeout 15초 (CURLOPT_TIMEOUT)
Connect Timeout 10초 (CURLOPT_CONNECTTIMEOUT)
SSL 검증 1차: SSL_VERIFYPEER=true, SSL_VERIFYHOST=2 (정상)
SSL 폴백 1차 실패 시 SSL_VERIFYPEER=false로 재시도 (저가형 호스팅 대응)
Follow Redirect CURLOPT_FOLLOWLOCATION=true

⚠️ SSL 폴백 보안 주의
SSL 인증서 검증 실패 시 SSL_VERIFYPEER=false로 재시도합니다.
이는 인증서 오류가 있는 저가형 호스팅에서도 동작하도록 설계된 것입니다.
운영 서버에서는 SSL 인증서가 올바르게 설치되어 폴백이 발동되지 않도록 해야 합니다.
폴백 발동 시 data/error.log에 경고 로그가 기록됩니다.


9장. 오류 화면 및 로그


9.1 오류 화면 (_social_notice.php)

소셜 로그인 중 오류 발생 시 _social_notice.php 템플릿으로 안내 화면이 표시됩니다. 화면에는 오류 메시지, 정확한 콜백 URL, 체크리스트가 포함됩니다.
// 표시 내용:
// 1. 오류 메시지 (빨간 박스)
// 2. 개발자 콘솔 Redirect URI 등록 필수 (콜백 URL 표시)
// 3. 체크리스트:
//    ① 콜백 URL을 개발자 콘솔에 등록했는지
//    ② 관리자 → 소셜 로그인에서 Client ID/Secret 입력 여부
//    ③ 관리자 → 사이트 설정에서 site_url 정확히 설정 여부
// 4. "다시 시도" 버튼 (소셜 로그인 시작으로)
// 5. "로그인으로" 버튼 (/auth/login)


9.2 오류 로그 (data/error.log)

로그 메시지 발생 원인
[SocialAuth] fetchToken 요청 | provider=... 토큰 요청 직전 기록 (정상 동작). 요청 파라미터 확인용
[SocialAuth] access_token 없음 | error=... 토큰 교환 실패. Client Secret 오류 또는 콜백 URL 불일치
[SocialAuth] state 불일치 OAuth CSRF 의심. 사용자가 브라우저 뒤로가기 후 재시도 시도
[SocialAuth] 토큰 획득 실패 | callback URL=... 콜백 URL이 개발자 콘솔 등록 URL과 불일치
[SocialAuth] kakao /v2/user/me 응답 없음 카카오 API 서버 문제 또는 액세스 토큰 만료
[SocialAuth] httpPost curl error cURL 네트워크 오류. SSL 인증서 문제 가능성
[SocialAuth] 경고: client_secret에 마스킹 문자 관리자가 마스킹된 Secret을 그대로 저장함


10장. 마이페이지 소셜 연결 관리


10.1 소셜 연결 현황 확인

회원은 마이페이지 → 소셜연결 탭에서 자신의 소셜 계정 연결 현황을 확인할 수 있습니다.
// 현재 회원의 연결된 소셜 계정 조회
SELECT * FROM dx_social_accounts WHERE member_id = ?

// 각 프로바이더별 표시
// 연결됨: "✓ 연결됨" 초록 배지 + 연결된 이메일 + 마지막 로그인
// 미연결: "연결하기" 버튼 → /auth/social?provider=kakao&redirect=/auth/mypage?tab=social


10.2 소셜 연결 추가

  1. 마이페이지 → 소셜연결 탭 클릭
  2. 연결하려는 프로바이더의 "연결하기" 버튼 클릭
  3. /auth/{provider}로 이동 → 소셜 인증 진행
  4. 콜백 처리 → loginOrRegister() → Case 2: 기존 회원에 소셜 연결
  5. dx_social_accounts에 새 레코드 INSERT
  6. 마이페이지 → 소셜연결 탭으로 리다이렉트 → "연결됨" 표시


10.3 활성화 조건

관리자 설정에서 enabled=1 이고 client_id가 있는 프로바이더만 마이페이지에 표시됩니다.
// 표시 조건 (profile.php, mypage.php)
if (!$cfg["enabled"] || !$cfg["client_id"]) continue;
// enabled=0이거나 client_id가 비어있으면 목록에 표시 안 됨


11장. 자주 묻는 질문 및 오류 해결

Q1. "토큰 획득 실패. (callback URL: ...)" 오류가 납니다.

콜백 URL이 개발자 콘솔에 등록된 URL과 정확히 일치하지 않는 것이 가장 흔한 원인입니다. 오류 화면에 표시된 콜백 URL을 복사하여 개발자 콘솔에 정확히 등록하세요. site_url 설정(관리자 → 사이트 설정)이 실제 접속 URL과 다른 경우에도 발생합니다.


Q2. 소셜 로그인 버튼이 로그인 페이지에 표시되지 않습니다.

관리자 → 소셜 로그인에서 해당 프로바이더의 활성화 토글이 OFF인 경우입니다. enabledProviders()는 enabled=1인 프로바이더만 반환합니다. 활성화 후에도 표시되지 않으면 DxSocialAuth.php 파일이 없는지 확인하세요.


Q3. 소셜 로그인 후 기존 회원과 연결이 안 됩니다.

이메일 기반 자동 연결(Case 2)은 소셜 계정의 이메일과 DXCMS 회원의 이메일이 정확히 일치해야 합니다. 카카오의 경우 이메일 동의를 거부하면 이메일이 전달되지 않아 자동 연결이 불가하고 신규 계정이 생성됩니다.


Q4. 소셜 로그인으로 가입한 회원의 비밀번호를 어떻게 설정하나요?

소셜 로그인으로 생성된 계정의 비밀번호는 32자 랜덤 문자열의 BCrypt 해시입니다. 사용자 본인은 비밀번호를 알 수 없습니다. 마이페이지 → 프로필 탭에서 "새 비밀번호" 필드를 입력하여 일반 로그인도 가능한 비밀번호를 새로 설정할 수 있습니다.


Q5. 구글 로그인이 "redirect_uri_mismatch" 오류가 납니다.

Google Cloud Console의 "승인된 리디렉션 URI"에 등록한 URL과 DXCMS가 전달하는 콜백 URL이 정확히 일치해야 합니다. http/https, www 포함/제외, 끝 슬래시(/) 여부까지 문자 하나도 다르면 안 됩니다. 오류 화면에 표시된 콜백 URL을 복사하여 그대로 등록하세요.


Q6. 새 소셜 프로바이더를 추가하려면?

DxSocialAuth.php에 다음 4곳을 추가하면 됩니다: ① providers() 배열, ② providerMeta() 배열, ③ getAuthUrl() switch-case, ④ fetchUserInfo() switch-case. 그리고 core/auth/{provider}.php, {provider}_callback.php 파일을 각 1줄씩 추가합니다.

// 예: 새 프로바이더 "myservice" 추가

// 1. providers() 배열에 추가
return array('kakao','naver','google','github','myservice');

// 2. providerMeta() 배열에 추가
'myservice' => array('label'=>'내서비스','color'=>'#1234ab','textColor'=>'#fff','icon'=>'fa-star'),

// 3. getAuthUrl() switch-case 추가
case 'myservice':
    return 'https://myservice.com/oauth/authorize?client_id=...'

// 4. fetchUserInfo() switch-case 추가
case 'myservice':
    $resp = self::httpGet('https://api.myservice.com/user', ...);
    return array('provider_id'=>..., 'email'=>..., 'name'=>..., 'profile_img'=>...);

// 5. core/auth/myservice.php
require_once DX_CORE . '/auth/_social_common.php';
dx_social_start('myservice');

// 6. core/auth/myservice_callback.php
require_once DX_CORE . '/auth/_social_common.php';
dx_social_callback('myservice');

댓글0

로그인 후 댓글을 작성할 수 있습니다.
1. DX 철학 / 개념 왜 DXCMS를 만들었는가 2026.04.20 1. DX 철학 / 개념 DXCMS란 무엇인가 2026.04.20 DXCMS 활용 (CMS) DXCMS 날코딩•막코딩 완전 허용 2026.04.12
31
전체 회원
503
전체 게시글
770
전체 댓글
441
오늘 방문
33,173
전체 방문
2
현재 접속
인기글 7일 이내
최신글
최신댓글
목록