게임이 실행되면 여러분은 유저의 회원 가입 유무와 관계 없이 반드시 유저를 Hive 서버로 로그인시켜야 하며, Hive가 유저에게 가능하다고 반환한 로그인 타입으로 로그인을 수행해야 합니다.
로그인 타입 조회하기
Hive가 초기화 결과 값으로 전달하는 로그인 타입을 받는 방법 외에 여러분이 직접 API를 이용하여 유저에게 가능한 로그인 타입을 조회할 수 있습니다.
로그인 타입 설명
Hive 인증에서 사용하는 로그인 타입은 GUEST, ACCOUNT, SELECT, AUTO 네 종류입니다. Hive가 초기화 결과 값이나 로그인 타입 조회로 반환하는 로그인 타입, 타입별 의미는 다음과 같습니다.
- GUEST: Hive 계정으로 로그인한 이력이 없는 유저이며, 로그인 세션 키가 없는 경우
- ACCOUNT: Hive 계정으로 로그인한 이력이 있는 유저이나, 로그인 세션 키가 없는 경우
- SELECT: 로그인한 이력이 있는 여러 계정이 충돌하면서 한 계정을 선택해야 하는 유저이며, 초기화 및 로그인 타입 조회 결과값으로 반환되지 않은 경우
- AUTO: 게스트 로그인이나 Hive 정회원 로그인으로 여러분의 게임을 이용해 Hive 서버에 로그인한 이력이 있는 유저이며, 유저 기기에 로그인 세션 키가 있는 경우
로그인 타입 정보로 수행해야 하는 작업
- 게임 로그인 타입에 따라 다음의 안내대로 로그인 버튼을 제공하거나, 혹은 제공하지 마세요.
- GUEST: 정회원 로그인 과정을 거치지 않고 게임을 시작할 수 있게 하거나, 게스트 유저가 정회원으로 로그인하도록 유도하는 로그인 버튼을 제공하세요.
- ACCOUNT: 로그인 버튼을 제공하세요.
- SELECT: 유저가 게임을 이용했던 계정 중 어떤 계정으로 로그인할 지 유저가 선택할 수 있는 창을 제공하세요.
- AUTO: 유저의 단말기에 로그인 세션 키가 있기 때문에, 유저가 수동으로 로그인하지 않아도 됩니다. 로그인 버튼을 제공하지 마세요.
- 유저를 로그인 시킬 때
loginType
파라미터에 로그인 타입 값을 설정하여login()
메서드를 호출해 주세요.- Hive가 반환한 로그인 타입 값과 다른 로그인 타입 값을 설정하여
login()
메서드를 호출하면 Hive는 에러를 반환합니다.
- Hive가 반환한 로그인 타입 값과 다른 로그인 타입 값을 설정하여
로그인 타입 조회 구현하기
유저가 활용 가능한 로그인 타입을 조회하려면 Auth 클래스의 getLoginType()
메서드를 호출하세요.
다음은 유저에게 가능한 로그인 타입을 조회하는 코드 예제입니다.
API Reference: hive.Auth.getLoginType
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using hive; LoginType loginType = Auth.getLoginType(); switch (loginType) { case LoginType.GUEST: // 게스트 로그인 수행 가능 break; case LoginType.ACCOUNT: // Hive 로그인 수행 가능 break; case LoginType.SELECT: // 유저 선택 로그인 수행 가능 break; case LoginType.AUTO: // 자동 로그인 수행 가능 break; } |
API Reference: Auth::getLoginType
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; LoginType loginType = Auth::getLoginType(); switch (loginType) { case LoginType::GUEST: // 게스트 로그인 수행 가능 break; case LoginType::ACCOUNT: // Hive 로그인 수행 가능 break; case LoginType::SELECT: // 유저 선택 로그인 수행 가능 break; case LoginType::AUTO: // 자동 로그인 수행 가능 break; } |
API Reference: INSTANCE.getLoginType
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import com.hive.Auth val loginType = Auth.loginType when (loginType) { Auth.LoginType.GUEST -> { // 게스트 로그인 수행 가능 } Auth.LoginType.ACCOUNT -> { // Hive 로그인 수행 가능 } Auth.LoginType.SELECT -> { // 유저 선택 로그인 수행 가능 } Auth.LoginType.AUTO -> { // 자동 로그인 수행 가능 } else -> {} } |
API Reference: com.hive.Auth.getLoginType
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import com.hive.Auth; Auth.LoginType loginType = Auth.INSTANCE.getLoginType(); switch (loginType) { case GUEST: // 게스트 로그인 수행 가능 break; case ACCOUNT: // Hive 로그인 수행 가능 break; case SELECT: // 유저 선택 로그인 수행 가능 break; case AUTO: // 자동 로그인 수행 가능 break; default: break; } |
API Reference: AuthInterface.getLoginType
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import HIVEService let loginType: LoginType = AuthInterface.getLoginType() switch loginType { case .guest: // 게스트 로그인 수행 가능 case .account: // Hive 로그인 수행 가능 case .select: // 유저 선택 로그인 수행 가능 case .auto: // 자동 로그인 수행 가능 } |
API Reference: HIVEAuth:getLoginType
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#import <HIVEService/HIVEService-Swift.h> HIVELoginType loginType = [HIVEAuth getLoginType]; switch (loginType) { case HIVELoginTypeGuest: // 게스트 로그인 수행 가능 break; case HIVELoginTypeAccount: // Hive 로그인 수행 가능 break; case HIVELoginTypeSelect: // 유저 선택 로그인 수행 가능 break; case HIVELoginTypeAuto: // 자동 로그인 수행 가능 break; } |
게스트 로그인
Hive는 유저가 Hive에 가입하지 않고도 게임을 이용할 수 있도록 게스트 로그인을 지원합니다. Hive가 Hive 초기화의 결과나 getLoginType()
메서드 호출에 대한 결과로 로그인 타입이 GUEST가 반환되었다면, 유저의 단말기에서 이용 중인 게임 앱을 통해 Hive 서버에 정회원으로 로그인한 이력이 없음을 의미합니다. 혹시 이전에 유저의 단말기에서 동일 게임 앱으로 Hive 서버에 정회원 로그인한 이력이 있다 해도, 재 설치로인해 DID가 새로 발급 된 경우도 Hive는 GUEST를 반환합니다.
유저가 게스트로 로그인을 수행하면, Hive는 유저에게 게임 내에서 고유한 유저 ID인 VID를 발급합니다. 이 때 발급된 VID는 게임 앱의 데이터나 앱이 삭제되기 전까지는 유효합니다. 처음 게스트로 로그인한 이후에, 유저가 Hive 정회원으로 로그인하지 않는 이상, 유저는 AUTO 로그인 타입으로 Hive 서버에 로그인해야합니다.
게스트 로그인 정책
유저가 게스트로 로그인했을 때 다음의 정책을 반드시 준수하세요.
게스트 유저가 정회원과 게임을 동일하게 이용할 수 있게 구현하세요.
게스트로 로그인을 하면, 계정이 필요한 소셜 기능들을 사용하지는 못하지만, Hive의 기능 대부분을 이용할 수 있습니다. 때문에 여러분의 게임에서도 게스트로 로그인한 유저가 계정으로 로그인 한 유저와 동일하게 게임을 이용할 수 있도록 구현해 주세요. 예를 들어 게스트 유저도 게임 내에서 아이템을 구매하고 결제할 수 있어야 합니다.
게스트 유저에게 로그아웃 기능을 제공하지 마세요.
유저가 게스트로 로그인 한 후 로그아웃을 하게 된다면, 유저의 정보를 추적할 수 있는 VID가 사라집니다. 유저가 로그아웃 한 후, 로그인 했던 때에 대한 문의를 하게 되는 경우, 예를 들어 결제에 대한 문의를 할 경우, 대응하기가 어려워 집니다. 따라서 유저가 게스트로 로그인 했을 때는 로그아웃을 못하도록 로그아웃 버튼을 제공하지 마세요.
중국 게스트 로그인 금지 정책
중국 IP로 게임에 접속하면 실명 인증된 회원만 재화를 충전하거나 소비할 수 있습니다 (17. 5. 1시행). 따라서 중국 IP로 게임에 최초로 접근하면 ‘게스트 로그인’ 버튼 혹은 자동 로그인 절차 없이, Hive 로그인 페이지를 표시해야 합니다. 유저가 만약 정책 시행 전 유입된 게스트 회원이라면 Hive 정회원으로 전환을 유도하거나 혹은 강제하는 작업이 필요합니다.
다만, 법규의 강제성이 검증되지 않은 상황에서 기존 게스트를 모두 차단한다면 유저가 이탈할 우려가 있습니다. 따라서 기존 게스트 회원 유저는 컴투스나 컴투스홀딩스의 정책대로 자율 처리하되, 중국 당국의 제재 발생 시 강제 전환이 필요합니다. 유저의 접속 IP가 중국인지 판단하려면 Hive 타임존 서비스를 사용하여 구현하세요.
중국 IP로 접속 시 신규 게스트 회원 차단 적용 형태 예시
- 게임 로딩 화면에서 ‘게스트 로그인’ 버튼 삭제
- 게임 최초 실행 시, 게스트로 자동 로그인하는 과정 삭제
중국 IP로 접속 시 기존 게스트 회원 차단 적용 형태 예시
다음 안내와 같이 Hive 정회원 가입 권유 팝업을 제공하세요. Hive 가입 권유 시에는 팝업 내에서 ‘가입’ 혹은 ‘다음에 하기’ 버튼을 제공하고, Hive 가입 강제 시에는 ‘가입’ 혹은 ‘게임 종료’ 버튼을 제공하세요.
- 게임 내부에서 상점에 접근하면 Hive 정회원 가입 권유 팝업 제공
- 게임 접속 시, 로비에서 Hive 정회원 가입 권유 팝업 제공
게스트로 로그인하기
유저를 게스트로 로그인 시키려면 Auth 클래스의 login()
메서드를 호출하세요. 게스트 로그인이 성공적으로 수행되면 Hive는 currentAccount에 유저에 대한 식별 정보를 담아 반환합니다. usedAccount
값은 null
로 반환합니다. 유저의 정보를 받으면 유저의 로그인 세션 키를 게임 서버에 저장해 놓으세요.
다음은 유저를 게스트로 로그인 시키는 예제 코드입니다.
API Reference: hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 |
using hive; LoginType loginType = LoginType.GUEST; Auth.login(loginType, (ResultAPI result, LoginType loginType, Account currentAccount, Account usedAccount) => { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) Application.Quit(); } }); |
API Reference: Auth::login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; LoginType loginType = LoginType::GUEST; Auth::login(loginType, [=](ResultAPI result,LoginType loginType, Account currentAccount, Account usedAccount) { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // Cocos2d-x 엔진 사용자 // 예) exit(0); // Unreal 엔진 사용자 // 예) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false); } ); |
API Reference: com.hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import com.hive.Auth import com.hive.ResultAPI val loginType = Auth.LoginType.GUEST Auth.login(loginType, object : Auth.AuthLoginListener { override fun onAuthLogin(result: ResultAPI, loginType: Auth.LoginType?, currentAccount: Auth.Account?, usedAccount: Auth.Account?) { if (result.isSuccess) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) exitProcess(0) } } }) |
API Reference: com.hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import com.hive.Auth; import com.hive.ResultAPI; Auth.LoginType loginType = Auth.LoginType.GUEST; Auth.INSTANCE.login(loginType, (result, loginType1, currentAccount, usedAccount) -> { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) System.exit(0); } }); |
API Reference: HIVEAuth:login
1 2 3 4 5 6 7 8 9 10 11 12 |
import HIVEService let loginType = AuthLoginType.guest AuthInterface.login(loginType) { result, loginType, currentAccount, usedAccount in if result.isSuccess() { // 호출 성공 } else if result.needExit() { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0) } } |
API Reference: HIVEAuth:login
1 2 3 4 5 6 7 8 9 10 11 12 |
#import <HIVEService/HIVEService-Swift.h> HIVELoginType loginType = HIVELoginTypeGuest; [HIVEAuth login: loginType handler: ^(HIVEResultAPI *result, HIVELoginType loginType, HIVEAccount *currentAccount, HIVEAccount *usedAccount) { if ([result isSuccess]) { // 호출 성공 } else if ([result needExit]) { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0); } }]; |
정회원 로그인 (Hive 로그인)
Hive에 가입하여 Hive 계정을 가지고 있는 유저를 정회원이라고 하며, 정회원으로 로그인하는 것을 Hive 로그인이라고 부릅니다. 유저가 Hive에 가입하여 정회원이 되면 Hive는 유저에게 Hive 내에서 고유한 유저 ID인 uid를 발급합니다.
정회원 유저가 유저의 단말기에서 게임을 게스트로 이용해 본 적 없이 최초로 이용할 때 Hive는 정회원 유저에게 게임 내에서 고유한 유저 ID인 VID를 발급하며, 유저의 uid와 VID를 연결합니다. 만약 이미 유저의 단말기에 동일 게임에 대한 VID가 발급되어 있다면, 즉 유저의 단말기에서 게스트로 로그인 한 이력이 남아 있다면, Hive는 정회원 유저의 uid와 이미 발급된 VID를 연결합니다.
정회원 유저가 로그아웃 후, 다시 로그인할 때는 UID나 VID가 신규 발급되지 않고, 이미 발급된 UID와 VID로 로그인 됩니다.
게스트로 로그인 한 유저가 게임 중 정회원으로 로그인 할 수 있나요?
게스트로 로그인 한 유저가 게임 중 정회원으로 로그인 할 수 있습니다. 물론, 게임에서 Hive로 로그인 하는 버튼이나 링크를 제공해 주어야 로그인 시도가 가능합니다.
정회원으로 로그인하기 (Hive 로그인 하기)
유저를 Hive 정회원으로 로그인 시키려면 Auth 클래스의 login()
메서드를 호출하세요. 정회원 로그인 시도 시 유저의 단말기에서 이미 정회원으로 로그인 했던 세션 기록이 있는지 없는지에 따라 Hive는 다음의 두 옵션 중 하나를 수행합니다:
- 정회원 로그인 세션 기록이 있음: Hive는 자동 로그인을 수행합니다.
- 정회원 로그인 세션 기록이 없음: 유저의 ID와 패스워드 입력이 필요하여 Hive는 로그인 화면을 띄울 것입니다.
Hive는 정회원 로그인을 성공적으로 수행하면, 유저의 식별 정보를 login()
메서드에 전달되었던 콜백 함수의 세 번째 파라미터인 currentAccount에 담아 반환합니다. 유저의 정보를 받으면 유저의 로그인 세션 키를 게임 서버에 저장해 놓으세요.
다음은 유저를 Hive 정회원으로 로그인 시키는 예제 코드입니다.
API Reference: hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 |
using hive; LoginType loginType = LoginType.ACCOUNT; Auth.login(loginType, (ResultAPI result, LoginType loginType, Account currentAccount, Account usedAccount) => { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) Application.Quit(); } }); |
API Reference: Auth::login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; LoginType loginType = LoginType::ACCOUNT; Auth::login(loginType, [=](ResultAPI result,LoginType loginType, Account currentAccount, Account usedAccount) { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // Cocos2d-x 엔진 사용자 // 예) exit(0); // Unreal 엔진 사용자 // 예) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false); } ); |
API Reference: com.hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import com.hive.Auth import com.hive.ResultAPI val loginType = Auth.LoginType.ACCOUNT Auth.login(loginType, object : Auth.AuthLoginListener { override fun onAuthLogin(result: ResultAPI, loginType: Auth.LoginType?, currentAccount: Auth.Account?, usedAccount: Auth.Account?) { if (result.isSuccess) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) exitProcess(0) } } }) |
API Reference: com.hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import com.hive.Auth; import com.hive.ResultAPI; Auth.LoginType loginType = Auth.LoginType.ACCOUNT; Auth.INSTANCE.login(loginType, (result, loginType1, currentAccount, usedAccount) -> { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) System.exit(0); } }); |
API Reference: HIVEAuth:login
1 2 3 4 5 6 7 8 9 10 11 12 |
import HIVEService let loginType = AuthLoginType.account AuthInterface.login(loginType) { result, loginType, currentAccount, usedAccount in if result.isSuccess() { // 호출 성공 } else if result.needExit() { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0) } } |
API Reference: HIVEAuth:login
1 2 3 4 5 6 7 8 9 10 11 12 |
#import <HIVEService/HIVEService-Swift.h> HIVELoginType loginType = HIVELoginTypeAccount; [HIVEAuth login: loginType handler: ^(HIVEResultAPI *result, HIVELoginType loginType, HIVEAccount *currentAccount, HIVEAccount *usedAccount) { if ([result isSuccess]) { // 호출 성공 } else if ([result needExit]) { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0); } }]; |
계정 선택 로그인
계정 선택이란 유저가 로그인한 계정 이력이 하나 이상 있을 때 어떤 계정으로 로그인할 지를 선택하는 것을 의미합니다. 유저의 단말기에서 게임을 이용한 이력이 있어 이미 발급된 VID가 있고 동일 단말기에서 Hive 계정으로 로그인하려고 할 때, Hive 계정과 연동된 VID가 이미 있다면 충돌이 발생합니다.
게임에서는 유저가 계정 선택을 해야 하는지에 대한 여부를 알 수 있어야 하고, 계정 선택을 해야 한다면 [tooltips keyword=”계정 선택 UI” content=”“]를 제공해야 합니다. 이 두 가지 모두를 Hive에서 제공합니다.
계정 선택이 필요한지를 언제, 어떻게 알 수 있나요?
계정 선택이 필요한 상황이라면, 유저를 정회원으로 로그인 시키려고 할 때 Hive가 게임에게 알려 줍니다. 즉, loginType
을 ACCOUNT로 설정하여 Auth 클래스의 login()
메서드를 호출 시 그 결과로 다음 정보를 반환합니다.
loginType
파라미터: SELECT에 해당하는 열거형currentAccount
파라미터: 단말기에서 게스트로 로그인 된 게스트 계정 정보 (Account 클래스)usedAccount
파라미터: 정회원 계정 정보 (Account 클래스)
계정 선택 UI는 어떻게 제공할 수 있나요? Hive UI를 이용해야 하나요?
Hive가 제공하는 계정 선택 UI를 띄우려면 Auth 클래스의 showLoginSelection()
메서드를 호출하세요.
Hive가 제공하는 계정 선택 UI를 사용하지 않으려면, 계정 선택 대응하기의 1번 단계까지 수행한 후, 유저가 계정을 선택하게 하는 UI를 직접 구현하여 제공하세요. 유저가 계정을 선택한 후 반드시 Auth 클래스의 bindLogin()
메서드를 호출하여 유저가 선택한 계정의 VID와 유저의 정회원 계정을 연동하세요.
API Reference: hive.Auth.bindLogin
1 2 3 4 5 6 7 8 9 10 11 12 13 |
using hive; // 현재 VID 또는 사용 이력이 있는 VID String bindVid = "123456789"; Auth.bindLogin(bindVid, (ResultAPI result, LoginType loginType, Account currentAccount, Account usedAccount) => { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) Application.Quit(); } }); |
API Reference: Auth::bindLogin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; // 현재 VID 또는 사용 이력이 있는 VID std::string bindVid = "123456789"; Auth::bindLogin(bindVid, [=](ResultAPI result, LoginType loginType, Account currentAccount, Account usedAccount) { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // Cocos2d-x 엔진 사용자 // 예) exit(0); // Unreal 엔진 사용자 // 예) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false); } }); |
API Reference: com.hive.Auth.bindLogin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import com.hive.Auth import com.hive.ResultAPI // 현재 VID 또는 사용 이력이 있는 VID val bindVid = "123456789" Auth.bindLogin(bindVid, object: Auth.AuthLoginListener{ override fun onAuthLogin(result: ResultAPI, loginType: Auth.LoginType?, currentAccount: Auth.Account?, usedAccount: Auth.Account?) { if (result.isSuccess) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) exitProcess(0) } } }) |
API Reference: com.hive.Auth.bindLogin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import com.hive.Auth; import com.hive.ResultAPI; // 현재 VID 또는 사용 이력이 있는 VID String bindVid = "123456789"; Auth.INSTANCE.bindLogin(bindVid, (result, loginType, currentAccount, usedAccount) -> { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) System.exit(0); } }); |
API Reference: HIVEAuth:bindLogin
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import HIVEService // 현재 VID 또는 사용 이력이 있는 VID let bindVid = "123456789" AuthInterface.bindLogin(bindVid) { result, loginType, currentAccount, usedAccount in if result.isSuccess() { // 호출 성공 } else if result.needExit() { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0) } } |
API Reference: HIVEAuth:bindLogin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#import <HIVEService/HIVEService-Swift.h> // 현재 VID 또는 사용 이력이 있는 VID NSString *bindVid = @"123456789"; // 사용자가 선택한 계정의 VID를 유저의 Hive 계정과 연동하기 [HIVEAuth bindLogin: bindVid handler: ^(HIVEResultAPI *result, HIVELoginType loginType, HIVEAccount *currentAccount, HIVEAccount *usedAccount) { if ([result isSuccess]) { // 호출 성공 } else if ([result needExit]) { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0); } }]; |
계정 선택 대응하기
다음은 Hive가 제공하는 계정 선택 UI를 이용하여 계정 선택 상황을 대응하는 방법에 대해 안내합니다.
- 정회원 로그인 수행 시 결과로 전달받은
loginType
값이 SELECT에 해당하는 열거형인지 확인하세요. SELECT라면, 전달 받은currentAccount
의vid
와usedAccount
의vid
를 전역 변수에 저장해 두세요.
showLoginSelection()
메서드의 파라미터들을 다음과 같이 정의하세요.currentVidData
: 단말기에 로그인 되어 있는 게스트 계정 정보 (JSON 형식)usedVidData
: 유저가 로그인을 시도했던 정회원 계정 정보 (JSON 형식)
계정 정보 JSON 형식 스키마 예제: vid와 data 필드는 필수입니다. data 오브젝트 안에는 유저에 대한 정보를 자유 형식으로 추가할 수 있습니다.
1234{"vid": <유저 vid, String>"data": {"Name": <게임 내 유저 이름, String>, "Level": <게임 내 유저 레벨, Number>}}
showLoginSelection()
메서드의 콜백 함수를 구현하세요.showLoginSelection()
메서드를 호출하여 Hive가 제공하는 계정 선택 창을 띄우세요.
다음은 위 가이드의 2번–4번 단계를 구현한 예제 코드입니다.
API Reference: hive.Auth.showLoginSelection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using hive; String currentVid = ""; String usedVid = ""; // 1. 단말기에 로그인 되어 있는 게스트 계정 정보 JSONObject currentVidData = new JSONObject(); currentVidData.AddField("vid", currentVid); JSONObject currentVidGameData = new JSONObject(); currentVidGameData.AddField("Name", "currentName"); currentVidGameData.AddField("Level", 10); currentVidData.AddField("data", currentVidGameData); // 2. 유저가 입력한 정회원 계정의 계정 정보 JSONObject usedVidData = new JSONObject(); usedVidData.AddField("vid", usedVid); JSONObject usedVidGameData = new JSONObject(); usedVidGameData.AddField("Name", "usedName"); usedVidGameData.AddField("Level", 11); usedVidData.AddField("data", usedVidGameData); // 3. 계정 선택 UI 호출하기 Auth.showLoginSelection (currentVidData, usedVidData, (ResultAPI result, LoginType loginType, Account currentAccount, Account usedAccount) => { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) Application.Quit(); } }); |
API Reference: Auth::showLoginSelection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; string currentVid = ""; string usedVid = ""; // 1. 단말기에 로그인 되어 있는 게스트 계정 정보 picojson::object currentVidData; currentVidData["vid"] = picojson::value(currentVid); picojson::object currentVidGameData; currentVidGameData["Name"] = picojson::value("CurrentName"); currentVidGameData["Level"] = picojson::value((double)10); currentVidData["data"] = picojson::value(currentVidGameData); // 2. 유저가 입력한 정회원 계정의 계정 정보 picojson::object usedVidData; usedVidData["vid"] = picojson::value(usedVid); picojson::object usedVidGameData; usedVidGameData["Name"] = picojson::value("usedName"); usedVidGameData["Level"] = picojson::value((double)11); usedVidData["data"] = picojson::value(usedVidGameData); // 3. 계정 선택 UI 호출하기 Auth::showLoginSelection(currentVidData, usedVidData, [=](ResultAPI result, LoginType loginType, Account currentAccount, Account usedAccount) { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // Cocos2d-x 엔진 사용자 // 예) exit(0); // Unreal 엔진 사용자 // 예) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false); } }); |
API Reference: Auth.showLoginSelection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import com.hive.Auth import com.hive.ResultAPI val currentVid = "" val usedVid = "" // 1. 단말기에 로그인 되어 있는 게스트 계정 정보 val currentVidData: MutableMap<String, Any> = HashMap() currentVidData["vid"] = currentVid val currentVidGameData: MutableMap<String, Any> = HashMap() currentVidGameData["Name"] = "CurrentName" currentVidGameData["Level"] = 10 currentVidData["data"] = currentVidGameData // 2. 유저가 입력한 정회원 계정의 계정 정보 val usedVidData: MutableMap<String, Any> = HashMap() usedVidData["vid"] = usedVid val usedVidGameData: MutableMap<String, Any> = HashMap() usedVidGameData["Name"] = "UsedName" usedVidGameData["Level"] = 11 usedVidData["data"] = usedVidGameData // 3. 계정 선택 UI 호출하기 Auth.showLoginSelection(currentVidData, usedVidData, object : Auth.AuthLoginListener { override fun onAuthLogin(result: ResultAPI, loginType: Auth.LoginType?, currentAccount: Auth.Account?, usedAccount: Auth.Account?) { if (result.isSuccess) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) exitProcess(0) } } }) |
API Reference: com.hive.Auth.showLoginSelection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import com.hive.Auth; import com.hive.ResultAPI; String currentVid = ""; String usedVid = ""; // 1. 단말기에 로그인 되어 있는 게스트 계정 정보 Map<String, Object> currentVidData = new HashMap<>(); currentVidData.put("vid", currentVid); Map<String, Object> currentVidGameData = new HashMap<>(); currentVidGameData.put("Name", "CurrentName"); currentVidGameData.put("Level", 10); currentVidData.put("data", currentVidGameData); // 2. 유저가 입력한 정회원 계정의 계정 정보 Map<String, Object> usedVidData = new HashMap<>(); usedVidData.put("vid", usedVid); Map<String, Object> usedVidGameData = new HashMap<>(); usedVidGameData.put("Name", "UsedName"); usedVidGameData.put("Level", 11); usedVidData.put("data", usedVidGameData); // 3. 계정 선택 UI 호출하기 Auth.INSTANCE.showLoginSelection(currentVidData, usedVidData, (result, loginType, currentAccount, usedAccount) -> { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) System.exit(0); } }); |
API Reference: AuthInterface.showLoginSelection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import HIVEService let currentVid = "" let usedVid = "" // 1. 단말기에 로그인 되어 있는 게스트 계정 정보 let currentVidData: [String: Any] = ["data": ["Name": "CurrentName", "Level": "10"], "vid": currentVid] // 2. 유저가 입력한 정회원 계정의 계정 정보 let selectVidData: [String: Any] = ["data": ["Name": "UsedName", "Level": "11"], "vid": usedVid] // 3. 계정 선택 UI 호출하기 AuthInterface.showLoginSelection(currentVidData, usedData: selectVidData) { result, loginType, currentAccount, usedAccount in if result.isSuccess() { // 호출 성공 } else if result.needExit() { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0) } } |
API Reference: HIVEAuth:showLoginSelection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#import <HIVEService/HIVEService-Swift.h> NSString *currentVid = @""; NSString *usedVid = @""; // 1. 단말기에 로그인 되어 있는 게스트 계정 정보 NSDictionary *currentVidData = @{@"data": @{@"Name": @"CurrentName", @"Level": @"10"}, @"vid": currentVid}; // 2. 유저가 입력한 정회원 계정의 계정 정보 NSDictionary* selectVidData = @{@"data": @{@"Name": @"UsedName", @"Level": @"11"}, @"vid": usedVid}; // 3. 계정 선택 UI 호출하기 [HIVEAuth showLoginSelection: currentVidData usedData: selectVidData handler: ^(HIVEResultAPI *result, HIVELoginType loginType, HIVEAccount *currentAccount, HIVEAccount *usedAccount) { if ([result isSuccess]) { // 호출 성공 } else if ([result needExit]) { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0); } }]; |
자동 로그인
게스트로 로그인을 하였던지, 정회원으로 로그인을 하였던지, 한 번이라도 유저의 단말기에서 Hive 서버로 로그인을 했다면, Hive가 발급한 세션 키가 유저의 단말기에 남아 있을 것입니다.
자동 로그인이 가능한 상태, 즉 Hive가 초기화 결과나 getLoginType()
메서드의 결과 값으로 반환한 로그인 타입이 AUTO일 때, 로그인 함수(Auth 클래스의 login()
메서드)에 로그인 타입 파라미터를 AUTO로 설정하여 호출하면, Hive는 자동으로 유저를 로그인 시킵니다. 이 때 세션 키가 게스트 로그인 세션에 대한 세션 키이면 유저는 자동으로 게스트로 로그인하게 되며, 세션 키가 정회원 로그인 세션에 대한 세션 키이면 유저는 자동으로 정회원으로 로그인하게 됩니다.
로그인 세션 키 만료
만약 유저의 세션 키가 만료된 세션 키라면, Hive는 Result API의 결과 값으로 errorCode = INVALID_SESSION(-9), Code = AuthInvalidAccountSession(-1100016)를 반환합니다. 이 때는 자동 로그인이 불가능하므로 유저가 수동으로 로그인 할 수 있도록 로그인 버튼을 제공하세요.
다음은 유저를 자동 로그인 예제 코드입니다.
API Reference: hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 |
using hive; LoginType loginType = LoginType.AUTO; Auth.login(loginType, (ResultAPI result, LoginType loginType, Account currentAccount, Account usedAccount) => { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) Application.Quit(); } }); |
API Reference: Auth::login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; LoginType loginType = LoginType::AUTO; Auth::login(loginType, [=](ResultAPI result,LoginType loginType, Account currentAccount, Account usedAccount) { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // Cocos2d-x 엔진 사용자 // 예) exit(0); // Unreal 엔진 사용자 // 예) UKismetSystemLibrary::QuitGame(GetWorld(), nullptr, EQuitPreference::Quit, false); } }); |
API Reference: com.hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import com.hive.Auth import com.hive.ResultAPI val loginType = Auth.LoginType.AUTO Auth.login(loginType, object : Auth.AuthLoginListener { override fun onAuthLogin(result: ResultAPI, loginType: Auth.LoginType?, currentAccount: Auth.Account?, usedAccount: Auth.Account?) { if (result.isSuccess) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) exitProcess(0) } } }) |
API Reference: com.hive.Auth.login
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import com.hive.Auth; import com.hive.ResultAPI; Auth.LoginType loginType = Auth.LoginType.AUTO; Auth.INSTANCE.login(loginType, (result, loginType1, currentAccount, usedAccount) -> { if (result.isSuccess()) { // 호출 성공 } else if (result.needExit()) { // TODO: 앱 종료 기능을 구현하세요 // 예) System.exit(0); } }); |
API Reference: HIVEAuth:login
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import HIVEService let loginType = AuthLoginType.auto // 자동 로그인 요청하기 AuthInterface.login(loginType) { result, loginType, currentAccount, usedAccount in if result.isSuccess() { // 호출 성공 } else if result.needExit() { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0) } } |
API Reference: HIVEAuth:login
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#import <HIVEService/HIVEService-Swift.h> HIVELoginType loginType = kHIVELoginTypeAuto; // 자동 로그인 요청하기 [HIVEAuth login: loginType handler: ^(HIVEResultAPI *result, HIVELoginType loginType, HIVEAccount *currentAccount, HIVEAccount *usedAccount) { if ([result isSuccess]) { // 호출 성공 } else if ([result needExit]) { // TODO: 앱 종료 기능을 구현하세요 // 예) exit(0); } }]; |
참고: Account 클래스
Name | Type | Description |
---|---|---|
vid | String | 현재 이용 중인 게임 내에서의 고유 유저 ID.
팁: 서버 유저 DB에서 유저 정보의 프라이머리 키 (PK)로 이용하세요. |
uid | String | Hive 내에서의 고유 유저 ID. 게스트로 로그인했을 때는 null 로 리턴됨. |
did | String | 단말기 ID
팁: did를 게임 서버 유저 DB에서 서브 키(Sub key)로 사용하세요. |
accessToken | String | 로그인 유효성을 확인하기 위해 Hive 서버에서 발급하는 고유 세션 키 |
인증 세션 키 유효성 검증
Hive는 동시에 두 대 이상의 단말기에서 동일 계정으로 게임을 이용하는 것, 즉 중복 이용을 방지하기 위한 세션 키 검증 API를 제공합니다. VID 별로 가장 최신 로그인 시 발급된 세션 키만 유효하며, 그 전에 발급된 세션 키들은 유효하지 않습니다.
유저의 세션 키를 검증하려면, 게임 서버에서 Hive 서버로부터 유저의 VID에 대한 세션 키를 요청하여 받은 후, 로그인 시 저장해 두었던 유저의 세션 키와 Hive 서버로부터 받은 유저의 세션 키를 비교하세요. 유효하지 않은 로그인 세션을 끊으면 게임 중복 이용을 막을 수 있습니다.
세션 키 검증 API는 서버 API로, 게임 서버에서 Hive 서버로 요청하는 API입니다. 세션 키 검증 API를 자세히 보려면 인증 v1 세션 검증하기를 확인 하세요.
로그아웃
정회원 유저를 로그아웃 시키려면 Auth 클래스의 logout()
메서드를 호출합니다. 게스트 유저에게는 로그아웃 기능을 절대 제공하지 마세요. 게스트 로그아웃 금지 이유에 대한 자세한 내용은 게스트 로그인 정책에서 확인할 수 있습니다.
다음은 Hive 정회원을 로그아웃 시키는 예제 코드입니다.
API Reference: hive.Auth.logout
1 2 3 4 5 6 7 |
using hive; Auth.logout((ResultAPI result) => { if (result.isSuccess()) { // 호출 성공 } }); |
API Reference: Auth::logout
1 2 3 4 5 6 7 8 9 |
#include <HIVE_SDK_Plugin/HIVE_CPP.h> using namespace std; using namespace hive; Auth::logout([=](ResultAPI result) { if (result.isSuccess()) { // 호출 성공 } }); |
API Reference: Auth.logout
1 2 3 4 5 6 7 8 9 10 |
import com.hive.Auth import com.hive.ResultAPI Auth.logout(object : Auth.AuthLogoutListener { override fun onAuthLogout(result: ResultAPI) { if (result.isSuccess) { // 호출 성공 } } }) |
API Reference: com.hive.Auth.logout
1 2 3 4 5 6 7 8 |
import com.hive.Auth; import com.hive.ResultAPI; Auth.INSTANCE.logout(result -> { if (result.isSuccess()) { // 호출 성공 } }); |
API Reference: AuthInterface.logout
1 2 3 4 5 6 7 |
import HIVEService AuthInterface.logout() { result in if result.isSuccess() { // 호출 성공 } } |
API Reference: HIVEAuth:logout
1 2 3 4 5 6 7 |
#import <HIVEService/HIVEService-Swift.h> [HIVEAuth logout: ^(HIVEResultAPI *result) { if ([result isSuccess]) { // 호출 성공 } }]; |