mirror of
				https://github.com/DerTyp7/defrain-shooter-unity.git
				synced 2025-11-04 15:18:59 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			179 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			179 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Collections;
 | 
						|
using UnityEngine;
 | 
						|
 | 
						|
namespace Mirror.Authenticators
 | 
						|
{
 | 
						|
    [AddComponentMenu("Network/Authenticators/BasicAuthenticator")]
 | 
						|
    public class BasicAuthenticator : NetworkAuthenticator
 | 
						|
    {
 | 
						|
        [Header("Custom Properties")]
 | 
						|
 | 
						|
        // set these in the inspector
 | 
						|
        public string username;
 | 
						|
        public string password;
 | 
						|
 | 
						|
        #region Messages
 | 
						|
 | 
						|
        public struct AuthRequestMessage : NetworkMessage
 | 
						|
        {
 | 
						|
            // use whatever credentials make sense for your game
 | 
						|
            // for example, you might want to pass the accessToken if using oauth
 | 
						|
            public string authUsername;
 | 
						|
            public string authPassword;
 | 
						|
        }
 | 
						|
 | 
						|
        public struct AuthResponseMessage : NetworkMessage
 | 
						|
        {
 | 
						|
            public byte code;
 | 
						|
            public string message;
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Server
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on server from StartServer to initialize the Authenticator
 | 
						|
        /// <para>Server message handlers should be registered in this method.</para>
 | 
						|
        /// </summary>
 | 
						|
        public override void OnStartServer()
 | 
						|
        {
 | 
						|
            // register a handler for the authentication request we expect from client
 | 
						|
            NetworkServer.RegisterHandler<AuthRequestMessage>(OnAuthRequestMessage, false);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on server from StopServer to reset the Authenticator
 | 
						|
        /// <para>Server message handlers should be registered in this method.</para>
 | 
						|
        /// </summary>
 | 
						|
        public override void OnStopServer()
 | 
						|
        {
 | 
						|
            // unregister the handler for the authentication request
 | 
						|
            NetworkServer.UnregisterHandler<AuthRequestMessage>();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on server from OnServerAuthenticateInternal when a client needs to authenticate
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="conn">Connection to client.</param>
 | 
						|
        public override void OnServerAuthenticate(NetworkConnection conn)
 | 
						|
        {
 | 
						|
            // do nothing...wait for AuthRequestMessage from client
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on server when the client's AuthRequestMessage arrives
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="conn">Connection to client.</param>
 | 
						|
        /// <param name="msg">The message payload</param>
 | 
						|
        public void OnAuthRequestMessage(NetworkConnection conn, AuthRequestMessage msg)
 | 
						|
        {
 | 
						|
            // Debug.LogFormat(LogType.Log, "Authentication Request: {0} {1}", msg.authUsername, msg.authPassword);
 | 
						|
 | 
						|
            // check the credentials by calling your web server, database table, playfab api, or any method appropriate.
 | 
						|
            if (msg.authUsername == username && msg.authPassword == password)
 | 
						|
            {
 | 
						|
                // create and send msg to client so it knows to proceed
 | 
						|
                AuthResponseMessage authResponseMessage = new AuthResponseMessage
 | 
						|
                {
 | 
						|
                    code = 100,
 | 
						|
                    message = "Success"
 | 
						|
                };
 | 
						|
 | 
						|
                conn.Send(authResponseMessage);
 | 
						|
 | 
						|
                // Accept the successful authentication
 | 
						|
                ServerAccept(conn);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                // create and send msg to client so it knows to disconnect
 | 
						|
                AuthResponseMessage authResponseMessage = new AuthResponseMessage
 | 
						|
                {
 | 
						|
                    code = 200,
 | 
						|
                    message = "Invalid Credentials"
 | 
						|
                };
 | 
						|
 | 
						|
                conn.Send(authResponseMessage);
 | 
						|
 | 
						|
                // must set NetworkConnection isAuthenticated = false
 | 
						|
                conn.isAuthenticated = false;
 | 
						|
 | 
						|
                // disconnect the client after 1 second so that response message gets delivered
 | 
						|
                StartCoroutine(DelayedDisconnect(conn, 1));
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        IEnumerator DelayedDisconnect(NetworkConnection conn, float waitTime)
 | 
						|
        {
 | 
						|
            yield return new WaitForSeconds(waitTime);
 | 
						|
 | 
						|
            // Reject the unsuccessful authentication
 | 
						|
            ServerReject(conn);
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
 | 
						|
        #region Client
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on client from StartClient to initialize the Authenticator
 | 
						|
        /// <para>Client message handlers should be registered in this method.</para>
 | 
						|
        /// </summary>
 | 
						|
        public override void OnStartClient()
 | 
						|
        {
 | 
						|
            // register a handler for the authentication response we expect from server
 | 
						|
            NetworkClient.RegisterHandler<AuthResponseMessage>((Action<AuthResponseMessage>)OnAuthResponseMessage, false);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on client from StopClient to reset the Authenticator
 | 
						|
        /// <para>Client message handlers should be unregistered in this method.</para>
 | 
						|
        /// </summary>
 | 
						|
        public override void OnStopClient()
 | 
						|
        {
 | 
						|
            // unregister the handler for the authentication response
 | 
						|
            NetworkClient.UnregisterHandler<AuthResponseMessage>();
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on client from OnClientAuthenticateInternal when a client needs to authenticate
 | 
						|
        /// </summary>
 | 
						|
        public override void OnClientAuthenticate()
 | 
						|
        {
 | 
						|
            AuthRequestMessage authRequestMessage = new AuthRequestMessage
 | 
						|
            {
 | 
						|
                authUsername = username,
 | 
						|
                authPassword = password
 | 
						|
            };
 | 
						|
 | 
						|
            NetworkClient.connection.Send(authRequestMessage);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// Called on client when the server's AuthResponseMessage arrives
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="msg">The message payload</param>
 | 
						|
        public void OnAuthResponseMessage(AuthResponseMessage msg)
 | 
						|
        {
 | 
						|
            if (msg.code == 100)
 | 
						|
            {
 | 
						|
                // Debug.LogFormat(LogType.Log, "Authentication Response: {0}", msg.message);
 | 
						|
 | 
						|
                // Authentication has been accepted
 | 
						|
                ClientAccept();
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                Debug.LogError($"Authentication Response: {msg.message}");
 | 
						|
 | 
						|
                // Authentication has been rejected
 | 
						|
                ClientReject();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |