using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
public class UserNetworkAuthenticator : NetworkAuthenticator
[SerializeField] private GameObject authRejectDialogPrefab;
readonly HashSet<NetworkConnection> connectionsPendingDisconnect = new HashSet<NetworkConnection>();
public struct AuthRequestMessage : NetworkMessage {
public string accessToken;
public struct AuthResponseMessage : NetworkMessage {
public override void OnStartServer()
NetworkServer.RegisterHandler<AuthRequestMessage>(OnAuthRequestMessage, false);
public override void OnStopServer()
NetworkServer.UnregisterHandler<AuthRequestMessage>();
public override void OnServerAuthenticate(NetworkConnectionToClient conn) { }
public void OnAuthRequestMessage(NetworkConnectionToClient conn, AuthRequestMessage msg)
if (connectionsPendingDisconnect.Contains(conn)) return;
StartCoroutine(APIGetUser(msg.accessToken, (www) => {
bool verify = www.result == UnityWebRequest.Result.Success;
AuthResponseMessage authResponseMessage = new AuthResponseMessage { success = verify };
conn.Send(authResponseMessage);
string jsonString = www.downloadHandler.text;
User userData = JsonUtility.FromJson<User>(jsonString);
conn.authenticationData = userData;
List<NetworkConnectionToClient> connsToDisconnect = new List<NetworkConnectionToClient>();
foreach(NetworkConnectionToClient currentConn in NetworkServer.connections.Values) {
if(currentConn == conn) {
User currentUser = (User)currentConn.authenticationData;
if(currentUser.snid == userData.snid) {
connsToDisconnect.Add(currentConn);
foreach(NetworkConnectionToClient currentConn in connsToDisconnect) {
currentConn.Disconnect();
connectionsPendingDisconnect.Add(conn);
conn.isAuthenticated = false;
StartCoroutine(DelayedDisconnect(conn, 1f));
IEnumerator APIGetUser(string accessToken, Action<UnityWebRequest> callback)
WWWForm form = new WWWForm();
form.AddField("accessToken", accessToken);
string url = Config.SCHEME + Config.CURRENT_DOMAIN + Config.API_ROUTE + "/users/getCurrentUserByAccessToken";
using(UnityWebRequest www = UnityWebRequest.Post(url, form)) {
yield return www.SendWebRequest();
IEnumerator DelayedDisconnect(NetworkConnectionToClient conn, float waitTime)
yield return new WaitForSeconds(waitTime);
connectionsPendingDisconnect.Remove(conn);
public override void OnStartClient()
NetworkClient.RegisterHandler<AuthResponseMessage>(OnAuthResponseMessage, false);
public override void OnStopClient()
NetworkClient.UnregisterHandler<AuthResponseMessage>();
public override void OnClientAuthenticate()
AuthRequestMessage authRequestMessage = new AuthRequestMessage {
snid = CurrentUser.Value.snid,
accessToken = CurrentUser.Value.accessToken
NetworkClient.Send(authRequestMessage);
public void OnAuthResponseMessage(AuthResponseMessage msg)
Debug.Log($"OnAuthResponseMessage {msg.success}");
if(msg.success == true) {
Instantiate(authRejectDialogPrefab);