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 |