Skip to content

Commit

Permalink
feat: adding INetworkPlayer to Authenticate
Browse files Browse the repository at this point in the history
This allows Authenticators to get the endpoint from INetworkPlayer. This is useful when using relays like EpicRelay, so that that you can Authenticator via the ProductId the player is using to connect

BREAKING CHANGE: Authenticate overrides now require INetworkPlayer argument
  • Loading branch information
James-Frowen committed Jun 18, 2023
1 parent fb34f4d commit ba54dd2
Show file tree
Hide file tree
Showing 6 changed files with 13 additions and 12 deletions.
2 changes: 1 addition & 1 deletion Assets/Mirage/Authenticators/BasicAuthenticator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class BasicAuthenticator : NetworkAuthenticator<BasicAuthenticator.JoinMe
public string ServerCode;

// called on server to validate
protected override AuthenticationResult Authenticate(JoinMessage message)
protected override AuthenticationResult Authenticate(INetworkPlayer player, JoinMessage message)
{
if (ServerCode == message.ServerCode)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ private void OnDestroy()
/// </summary>
private readonly Dictionary<INetworkPlayer, SessionKey> _playerKeys = new Dictionary<INetworkPlayer, SessionKey>();

protected override AuthenticationResult Authenticate(SessionKeyMessage message)
protected override AuthenticationResult Authenticate(INetworkPlayer player, SessionKeyMessage message)
{
if (message.SessionKey.Count == 0)
return AuthenticationResult.CreateFail(NO_KEY_ERROR);
Expand Down
9 changes: 5 additions & 4 deletions Assets/Mirage/Runtime/Authentication/NetworkAuthenticator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ internal sealed override void Setup(MessageHandler messageHandler, Action<INetwo

private async UniTaskVoid HandleAuth(INetworkPlayer player, T msg)
{
var result = await AuthenticateAsync(msg);
var result = await AuthenticateAsync(player, msg);
_afterAuth.Invoke(player, result);
}

Expand All @@ -40,11 +40,12 @@ private async UniTaskVoid HandleAuth(INetworkPlayer player, T msg)
/// By default the async version just call the normal version.
/// </para>
/// </summary>
/// <param name="player">player that send message</param>
/// <param name="message"></param>
/// <returns></returns>
protected internal virtual UniTask<AuthenticationResult> AuthenticateAsync(T message)
protected internal virtual UniTask<AuthenticationResult> AuthenticateAsync(INetworkPlayer player, T message)
{
return UniTask.FromResult(Authenticate(message));
return UniTask.FromResult(Authenticate(player, message));
}

/// <summary>
Expand All @@ -56,7 +57,7 @@ protected internal virtual UniTask<AuthenticationResult> AuthenticateAsync(T mes
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
protected virtual AuthenticationResult Authenticate(T message) => throw new NotImplementedException("You must Implement Authenticate or AuthenticateAsync");
protected virtual AuthenticationResult Authenticate(INetworkPlayer player, T message) => throw new NotImplementedException("You must Implement Authenticate or AuthenticateAsync");

/// <summary>
/// Sends Authentication from client
Expand Down
2 changes: 1 addition & 1 deletion Assets/Mirage/Samples~/Snippets/CustomAuthenticator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public struct CustomAuthMessage
public class CustomAuthenticator : NetworkAuthenticator<CustomAuthMessage>
{
// CodeEmbed-End: authenticator-def
protected override async UniTask<AuthenticationResult> AuthenticateAsync(CustomAuthMessage msg)
protected override async UniTask<AuthenticationResult> AuthenticateAsync(INetworkPlayer player, CustomAuthMessage msg)
{
// check user sent token, if they didn't then return fail
if (string.IsNullOrEmpty(msg.token))
Expand Down
2 changes: 1 addition & 1 deletion Assets/Tests/Runtime/Authentication/MockAuthenticator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class MockAuthenticator : NetworkAuthenticator<MockAuthenticator.MockMess
public bool Success = true;
public string FailReason = "Succcess is false";

protected override AuthenticationResult Authenticate(MockMessage message)
protected override AuthenticationResult Authenticate(INetworkPlayer player, MockMessage message)
{
if (Success)
return AuthenticationResult.CreateSuccess(this, new MockData { });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ public void CreateOrRefreshSessionReturnsBytes()
public IEnumerator ReturnSuccessWhenGivenKey() => UniTask.ToCoroutine(async () =>
{
var key = _serverAuthenticator.CreateOrRefreshSession(serverPlayer);
var result = await _serverAuthenticator.AuthenticateAsync(new SessionKeyMessage { SessionKey = key });
var result = await _serverAuthenticator.AuthenticateAsync(null, new SessionKeyMessage { SessionKey = key });
Assert.That(result.Success, Is.True);
Assert.That(result.Authenticator, Is.TypeOf<SessionIdAuthenticator>());
Expand All @@ -109,7 +109,7 @@ public void CreateOrRefreshSessionReturnsBytes()
// request key for player
// this should save auth data in session data
var key = _serverAuthenticator.CreateOrRefreshSession(serverPlayer);
var result = await _serverAuthenticator.AuthenticateAsync(new SessionKeyMessage { SessionKey = key });
var result = await _serverAuthenticator.AuthenticateAsync(null, new SessionKeyMessage { SessionKey = key });
Assert.That(result.Data, Is.TypeOf<SessionData>());
var sessionData = (SessionData)result.Data;
Expand All @@ -135,7 +135,7 @@ public void CanGetMockDataUsingGetData()
[UnityTest]
public IEnumerator ReturnFailWhenKeyIsNull() => UniTask.ToCoroutine(async () =>
{
var result = await _serverAuthenticator.AuthenticateAsync(new SessionKeyMessage { SessionKey = default });
var result = await _serverAuthenticator.AuthenticateAsync(null, new SessionKeyMessage { SessionKey = default });
Assert.That(result.Success, Is.False);
Assert.That(result.Reason, Is.EqualTo(SessionIdAuthenticator.NO_KEY_ERROR));
Expand All @@ -145,7 +145,7 @@ public void CanGetMockDataUsingGetData()
public IEnumerator ReturnFailWhenKeyIsNotFound() => UniTask.ToCoroutine(async () =>
{
var key = new ArraySegment<byte>(new byte[_serverAuthenticator.SessionIDLength]);
var result = await _serverAuthenticator.AuthenticateAsync(new SessionKeyMessage { SessionKey = key });
var result = await _serverAuthenticator.AuthenticateAsync(null, new SessionKeyMessage { SessionKey = key });
Assert.That(result.Success, Is.False);
Assert.That(result.Reason, Is.EqualTo(SessionIdAuthenticator.NOT_FOUND_ERROR));
Expand Down

0 comments on commit ba54dd2

Please sign in to comment.