Unity Engine

[Unity]Playfab + Firebase 인증

Aostols 2025. 3. 25. 13:09
반응형

Playfab 과 Firebase를 같이 쓰게 될 경우 유저 인증을 Playfab으로 하게 됩니다.

이때 Firebase 를 인증할 방법이 없어지게 됩니다.

Playfab 계정과 Firebase 계정이 1:1로 매칭되어야 하는데 만일 각자의 방법으로 로그인을 하게 된다면 매칭이 깨질 우려도 있습니다.

최악의 경우에는 다수의 Playfab유저가 하나의 Firebase를 공유 하는 상황도 발생 할 수 있습니다.

이럴경우 사용하는 것이 Firebase 의 SignInWithCustomToken 입니다.

 

일단 서비스의 주체는 Playfab이기 때문에 Playfab으로 인증을 해 줍니다.

google 인증이거나 email 등 어떤방식으로든 인증하면 됩니다.

이후 PlayfabId를 기준으로 FirebaseAdmin API를 활용하여 CustomToken을 발급 합니다.

이후 CustomToken을 활용하여 Firebase 인증을 합니다.

1. Playfab 인증(클라)

2. PlayfabId 발급 (클라)

3. FirebaseAdmin API 로 Custom Token 발급(서버)

4. Firebase 인증 (클라)

 

3번의 과정에서 FirebaseAdmin API를 사용하기 위해서는 서버환경에서만 가능한데 여기선 Azure Function으로 처리 합니다.

 

Dictionary<string, string> param = new Dictionary<string, string>();
param.Add("playfabToken", PlayFabId);

ExecuteFunctionRequest request = new ExecuteFunctionRequest
{
    Entity = new EntityKey()
    {
        Id = PlayFabSettings.staticPlayer.EntityId,
        Type = PlayFabSettings.staticPlayer.EntityType,
    },
    FunctionName = "***",
    FunctionParameter = param,
    GeneratePlayStreamEvent = false
};

PlayFabCloudScriptAPI.ExecuteFunction(request, result =>
{
    string customToken = result.FunctionResult.ToString();
    EMLog.Log("###########");
    EMLog.Log(customToken);
    EncPlayerPrefs.SetString("AuthToken", customToken);
    FirebaseAuth(customToken, authResult =>
    {
        callback.Invoke(authResult);
    });
}, error =>
{
    EMLog.Log($"### {error.ErrorMessage}");
    callback.Invoke(false);
});

클라이언트에서 서버로 호출하는 부분 입니다.

 

FunctionExecutionContext<Dictionary<string, string>> context = LitJson.JsonMapper.ToObject<FunctionExecutionContext<Dictionary<string, string>>>(requestBody);
Dictionary<string, string> args = context.FunctionArgument;

string token = args["playfabToken"];

FirebaseApp firebaseApp;
if (FirebaseApp.DefaultInstance == null)
{
    var credential = GetCredential();
    firebaseApp = FirebaseApp.Create(new AppOptions() { Credential = _credential });
}
else
{
    firebaseApp = FirebaseApp.DefaultInstance;
}

firebaseAuth = FirebaseAuth.GetAuth(firebaseApp);

result = await firebaseAuth!.CreateCustomTokenAsync(token);

AzureFunction 의 부분입니다.

 

playfabToken 을 받아서 CustomToken 을 만드는 방법입니다.

 

auth.SignInWithCustomTokenAsync(customToken).ContinueWith(task =>
{
    if (task.IsCanceled || task.IsFaulted)
    {
        EMLog.Log($"SignInWithCustomTokenAsync {task.IsCanceled} {task.IsFaulted}");
        callback.Invoke(false);
        return;
    }
    user = task.Result.User;
});

최종적으로 FirebaseAuth로 로그인 합니다.

 

이렇게 되면 Playfab 과 Firebase 가 1:1 매칭을 이루어 안정적인 서비스를 할 수 있게 됩니다.

반응형

'Unity Engine' 카테고리의 다른 글

[Unity]Playfab + AzureBlobStorage 사용하기  (0) 2024.12.26
[Unity]ECS - BurstCompile  (1) 2023.12.21
[Unity]ECS - 2  (0) 2023.12.19
[Unity]ECS  (1) 2023.12.05
[Unity] Animation Controller  (3) 2023.04.23