메인 콘텐츠로 이동

새 권한에 대한 동의 요청

플레이어가 권한이 있는 세션을 받은 후, 추가 권한을 활성화하고 싶어할 수 있습니다. 권한은 다음과 같은 이유로 비활성화될 수 있습니다:

  1. 권한이 기본적으로 활성화되기 위한 나이 임계값보다 낮습니다.
  2. 권한에 필요한 절대 최소 나이보다 낮습니다.
  3. 권한은 부모/보호자의 동의로만 활성화될 수 있으며, 동의 프로세스 중에 활성화되지 않았습니다.

/session/upgrade API

API 참조 보기

/session/upgrade API를 사용하여 추가 권한을 활성화할 수 있습니다. managedBy 필드가 PLAYER로 설정된 요청된 권한은 즉시 활성화됩니다. managedByGUARDIAN으로 설정된 권한이 있는 경우, 권한 변경에 동의하기 위해 부모/보호자가 완료해야 하는 도전이 생성됩니다.

부모 동의 요청

권한을 활성화하기 위해 부모 동의가 필요한 경우, 응답에 challenge가 포함됩니다. 이 도전은 QR 코드, OTP 또는 이메일을 사용하여 초기 나이 게이트 프로세스와 유사하게 공유할 수 있습니다.

한 가지 삶의 질 차이점은 이메일 주소를 지정하지 않고 /challenge/send-email API를 사용할 수 있으며, API가 플레이어에 대한 권한을 가장 최근에 승인한 부모/보호자에게 이메일을 보낸다는 것입니다. 이를 통해 플레이어는 이메일 주소를 직접 지정하지 않고도 권한 변경을 요청할 수 있습니다. 연결된 이메일 주소가 없는 경우, /challenge/send-email API는 INVALID_EMAIL 오류 코드로 응답하며, QR 코드나 OTP 제공 또는 플레이어에게 부모/보호자의 이메일 주소를 입력하도록 요청하는 것과 같은 다른 방법으로 대체해야 합니다.

예시

Unreal C++로 세션 업그레이드
// 권한이 GUARDIAN에 의해 관리되는 경우 새로운 동의 도전을 생성하고, 성공하면
// EnableFeature 콜백 매개변수를 호출하여 게임에서 기능을 켤 수 있습니다
void UKidWorkflow::UpgradeSession(const FString &FeatureName, TFunction<void()> EnableFeature)
{
TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject());
JsonObject->SetStringField(TEXT("sessionId"), SessionInfo->GetStringField(TEXT("sessionId")));

TSharedPtr<FJsonObject> PermJsonObject = MakeShareable(new FJsonObject());
PermJsonObject->SetStringField(TEXT("name"), FeatureName);

TArray<TSharedPtr<FJsonValue>> JsonArray;
JsonArray.Add(MakeShareable(new FJsonValueObject(PermJsonObject)));

JsonObject->SetArrayField(TEXT("requestedPermissions"), JsonArray);

FString ContentJsonString;
TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&ContentJsonString);
FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);

HttpRequestHelper::PostRequestWithAuth(BaseUrl + TEXT("/session/upgrade"), ContentJsonString, AuthToken,
[this, EnableFeature, FeatureName](FHttpResponsePtr Response, bool bWasSuccessful)
{
if (bWasSuccessful)
{
TSharedPtr<FJsonObject> JsonResponse;
TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(Response->GetContentAsString());
if (FJsonSerializer::Deserialize(Reader, JsonResponse))
{
if (JsonResponse->HasField(TEXT("challenge")))
{
TSharedPtr<FJsonObject> Challenge = JsonResponse->GetObjectField(TEXT("challenge"));
FString ChallengeId = Challenge->GetStringField(TEXT("challengeId"));
FString OneTimePassword = Challenge->GetStringField(TEXT("oneTimePassword"));
FString QRCodeUrl = Challenge->GetStringField(TEXT("url"));

SaveChallengeId(ChallengeId);

ShowConsentChallenge(ChallengeId, ConsentTimeoutSeconds, OneTimePassword, QRCodeUrl,
[this, EnableFeature, FeatureName](bool bConsentGranted, const FString &SessionId)
{
ClearChallengeId();
if (bConsentGranted)
{
GetSessionPermissions(SessionId, TEXT(""));
EnableFeature();
}
else
{
// 기능 켜기 요청이 거부됨, 아무것도 하지 않음
UE_LOG(LogTemp, Warning, TEXT("기능 %s에 대한 기능 요청이 거부되었습니다."), *FeatureName);
}
});
}
else if (JsonResponse->HasField(TEXT("session")))
{
SessionInfo = JsonResponse->GetObjectField(TEXT("session"));
SaveSessionInfo();
EnableFeature();
}
}
}
});
}