mirror of
https://github.com/MirrorNetworking/Mirror.git
synced 2024-11-18 02:50:32 +00:00
feat: Add Timeout to NetworkAuthenticator (#1091)
* Add timeout to NetworkAuthenticator * Added back the using Vis removed * updated doc * Typo
This commit is contained in:
parent
1fc1ed2708
commit
e8cc9ba27b
2
.gitignore
vendored
2
.gitignore
vendored
@ -60,4 +60,4 @@ docs/.sass-cache
|
|||||||
.Trashes
|
.Trashes
|
||||||
ehthumbs.db
|
ehthumbs.db
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
/VisRepo.txt
|
*.txt
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using UnityEngine.Events;
|
using UnityEngine.Events;
|
||||||
|
|
||||||
@ -15,6 +16,11 @@ namespace Mirror
|
|||||||
[HelpURL("https://mirror-networking.com/docs/Guides/Authentication.html")]
|
[HelpURL("https://mirror-networking.com/docs/Guides/Authentication.html")]
|
||||||
public abstract class NetworkAuthenticator : MonoBehaviour
|
public abstract class NetworkAuthenticator : MonoBehaviour
|
||||||
{
|
{
|
||||||
|
[Header("Configuration")]
|
||||||
|
|
||||||
|
[Range(0, 255), Tooltip("Timeout to auto-disconnect in seconds. Set to 0 for no timeout.")]
|
||||||
|
public byte timeout;
|
||||||
|
|
||||||
[Header("Event Listeners (optional)")]
|
[Header("Event Listeners (optional)")]
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -40,6 +46,9 @@ public virtual void OnStartServer() {}
|
|||||||
// This will get more code in the near future
|
// This will get more code in the near future
|
||||||
internal void OnServerAuthenticateInternal(NetworkConnection conn)
|
internal void OnServerAuthenticateInternal(NetworkConnection conn)
|
||||||
{
|
{
|
||||||
|
// Start the countdown for Authentication
|
||||||
|
if (timeout > 0) StartCoroutine(AuthenticationTimer(conn, true));
|
||||||
|
|
||||||
OnServerAuthenticate(conn);
|
OnServerAuthenticate(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -49,6 +58,16 @@ internal void OnServerAuthenticateInternal(NetworkConnection conn)
|
|||||||
/// <param name="conn">Connection to client.</param>
|
/// <param name="conn">Connection to client.</param>
|
||||||
public abstract void OnServerAuthenticate(NetworkConnection conn);
|
public abstract void OnServerAuthenticate(NetworkConnection conn);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called on server when the timeout expires without being authenticated
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="conn">Connection to client.</param>
|
||||||
|
public virtual void OnServerAuthenticationTimeout(NetworkConnection conn)
|
||||||
|
{
|
||||||
|
Debug.LogErrorFormat("OnServerAuthenticationTimeout: {0}", conn);
|
||||||
|
conn.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region client
|
#region client
|
||||||
@ -62,6 +81,9 @@ public virtual void OnStartClient() {}
|
|||||||
// This will get more code in the near future
|
// This will get more code in the near future
|
||||||
internal void OnClientAuthenticateInternal(NetworkConnection conn)
|
internal void OnClientAuthenticateInternal(NetworkConnection conn)
|
||||||
{
|
{
|
||||||
|
// Start the countdown for Authentication
|
||||||
|
if (timeout > 0) StartCoroutine(AuthenticationTimer(conn, false));
|
||||||
|
|
||||||
OnClientAuthenticate(conn);
|
OnClientAuthenticate(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,8 +93,39 @@ internal void OnClientAuthenticateInternal(NetworkConnection conn)
|
|||||||
/// <param name="conn">Connection of the client.</param>
|
/// <param name="conn">Connection of the client.</param>
|
||||||
public abstract void OnClientAuthenticate(NetworkConnection conn);
|
public abstract void OnClientAuthenticate(NetworkConnection conn);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Called on client when the timeout expires without being authenticated
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="conn">Connection of the client.</param>
|
||||||
|
public virtual void OnClientAuthenticationTimeout(NetworkConnection conn)
|
||||||
|
{
|
||||||
|
Debug.LogErrorFormat("OnClientAuthenticationTimeout: {0}", conn);
|
||||||
|
conn.Disconnect();
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This is called on both client and server if timeout > 0
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="conn">Connection of the client.</param>
|
||||||
|
public IEnumerator AuthenticationTimer(NetworkConnection conn, bool isServer)
|
||||||
|
{
|
||||||
|
if (LogFilter.Debug) Debug.LogFormat("Authentication countdown started {0} {1}", conn.connectionId, timeout);
|
||||||
|
|
||||||
|
yield return new WaitForSecondsRealtime(timeout);
|
||||||
|
|
||||||
|
if (conn != null && !conn.isAuthenticated)
|
||||||
|
{
|
||||||
|
if (LogFilter.Debug) Debug.LogFormat("Authentication Timeout {0}", conn.connectionId);
|
||||||
|
|
||||||
|
if (isServer)
|
||||||
|
OnServerAuthenticationTimeout(conn);
|
||||||
|
else
|
||||||
|
OnClientAuthenticationTimeout(conn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void OnValidate()
|
void OnValidate()
|
||||||
{
|
{
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 60 KiB |
@ -49,6 +49,7 @@ To make your own custom Authenticator, you can just create a new script in your
|
|||||||
Here are some tips for custom Authenticators:
|
Here are some tips for custom Authenticators:
|
||||||
|
|
||||||
- `OnStartServer` and `OnStartClient` are the appropriate methods to register server and client messages and their handlers. They're called from StartServer/StartHost, and StartClient, respectively.
|
- `OnStartServer` and `OnStartClient` are the appropriate methods to register server and client messages and their handlers. They're called from StartServer/StartHost, and StartClient, respectively.
|
||||||
|
- The base Authenticator includes a timeout feature so you can prevent rogue clients from locking up your connections.
|
||||||
- Send a message to the client if authentication fails, especially if there's some issue they can resolve.
|
- Send a message to the client if authentication fails, especially if there's some issue they can resolve.
|
||||||
- Call the `Disconnect()` method of the `NetworkConnection` on the server and client when authentication fails. If you want to give the user a few tries to get their credentials right, you certainly can, but Mirror will not do the disconnect for you.
|
- Call the `Disconnect()` method of the `NetworkConnection` on the server and client when authentication fails. If you want to give the user a few tries to get their credentials right, you certainly can, but Mirror will not do the disconnect for you.
|
||||||
- Remember to put a small delay on the Disconnect call on the server if you send a failure message so that it has a chance to be delivered before the connection is dropped.
|
- Remember to put a small delay on the Disconnect call on the server if you send a failure message so that it has a chance to be delivered before the connection is dropped.
|
||||||
|
Loading…
Reference in New Issue
Block a user