working on server authenticate users

This commit is contained in:
2026-05-13 23:47:33 -04:00
parent a9d2fd64de
commit 63d3806936
11 changed files with 125 additions and 36 deletions

View File

@@ -15,7 +15,8 @@ public partial class App : Application
if (string.IsNullOrWhiteSpace(username)) if (string.IsNullOrWhiteSpace(username))
{ {
throw new Exception("Missing required --user argument. Example: --user Keeper317"); username = "Test";
// throw new Exception("Missing required --user argument. Example: --user Keeper317");
} }
ClientSession.Username = username; ClientSession.Username = username;

View File

@@ -4,7 +4,8 @@
xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:RelayClient" xmlns:local="clr-namespace:RelayClient"
Title="RelayClient"> Title="RelayClient"
FlyoutBehavior="Flyout">
<ShellContent <ShellContent
Title="Home" Title="Home"

View File

@@ -8,10 +8,12 @@ namespace RelayClient;
public partial class MainPage : ContentPage public partial class MainPage : ContentPage
{ {
private readonly string _username; public static string _username;
private readonly RelaySocketClient _socket; private readonly RelaySocketClient _socket;
private readonly RtcBridgeService _rtc; private readonly RtcBridgeService _rtc;
public static string? _userToken;
private string? _currentChannelId; private string? _currentChannelId;
private string? _currentChannelName; private string? _currentChannelName;
@@ -23,6 +25,7 @@ public partial class MainPage : ContentPage
InitializeComponent(); InitializeComponent();
_username = username; _username = username;
UserLabel.Text = $"Logged in as: {_username}"; UserLabel.Text = $"Logged in as: {_username}";
if (!KeyStorage.HasKeys(_username)) if (!KeyStorage.HasKeys(_username))
@@ -32,7 +35,7 @@ public partial class MainPage : ContentPage
KeyStorage.SavePublicKey(_username, keys.publicKey); KeyStorage.SavePublicKey(_username, keys.publicKey);
} }
ServerAPI.setupClient(); var waitFor = ServerAPI.setupClient();
_socket = new RelaySocketClient(_username); _socket = new RelaySocketClient(_username);
_rtc = new RtcBridgeService( _rtc = new RtcBridgeService(
@@ -56,6 +59,8 @@ public partial class MainPage : ContentPage
}); });
}; };
// while(!waitFor.IsCompleted){}
_socket.Connect(); _socket.Connect();
} }

View File

@@ -1,18 +1,49 @@
using System.Net.Http.Headers; using System.Net.Http.Headers;
using System.Net.Http.Json; using System.Net.Http.Json;
using System.Text.Json; using System.Text.Json;
using RelayShared.Services;
namespace RelayClient; namespace RelayClient;
public class ServerAPI public class ServerAPI
{ {
static HttpClient client = new HttpClient { BaseAddress = new Uri("http://localhost:5000/") }; static HttpClient client = new HttpClient { BaseAddress = new Uri("http://192.168.1.85:5000/") };
static HttpClient core = new HttpClient { BaseAddress = new Uri("http://192.168.1.85:1337/") };
public static void setupClient() public static async Task setupClient()
{ {
client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add( client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json")); new MediaTypeWithQualityHeaderValue("application/json"));
core.DefaultRequestHeaders.Accept.Clear();
core.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
core.DefaultRequestHeaders.Add("User-Agent", "RelayClient");
MainPage._userToken = await CoreUserSignin(new AuthSignin
{
UserName = MainPage._username,
Password = "password"
});
await CoreUserAlive(new AuthSignin
{
UserName = MainPage._username,
Password = MainPage._userToken
});
}
public static async Task<Uri> CoreUserAlive(AuthSignin data)
{
HttpResponseMessage response = await core.PostAsJsonAsync("user/isAlive", data);
response.EnsureSuccessStatusCode();
return response.Headers.Location;
}
public static async Task<string> CoreUserSignin(AuthSignin data)
{
HttpResponseMessage response = await core.PostAsJsonAsync("user/signin", data);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
} }
public static async Task<Uri> PostOfferAsync(DBOffer offer) public static async Task<Uri> PostOfferAsync(DBOffer offer)

View File

@@ -19,7 +19,7 @@ public sealed class RelaySocketClient
public event Action<string>? ServerPublicKeyReceived; public event Action<string>? ServerPublicKeyReceived;
public event Action<string>? Log; public event Action<string>? Log;
public RelaySocketClient(string username, string url = "ws://localhost:1337/") public RelaySocketClient(string username, string url = "ws://192.168.1.85:5001/")
{ {
_username = username; _username = username;
_socket = new WebSocket(url); _socket = new WebSocket(url);
@@ -32,6 +32,7 @@ public sealed class RelaySocketClient
var publicKey = KeyStorage.LoadPublicKey(_username); var publicKey = KeyStorage.LoadPublicKey(_username);
SendRaw($"AUTHENTICATE_USER|{_username}|{MainPage._userToken}");
SendRaw($"REGISTER_KEY|{_username}|{publicKey}"); SendRaw($"REGISTER_KEY|{_username}|{publicKey}");
SendRaw("GET_SERVER_KEY"); SendRaw("GET_SERVER_KEY");
SendRaw("GET_CHANNELS"); SendRaw("GET_CHANNELS");

View File

@@ -1,5 +1,6 @@
using Microsoft.Extensions.Primitives; using Microsoft.Extensions.Primitives;
using RelayCore.Services; using RelayCore.Services;
using RelayShared.Services;
namespace RelayCore.Endpoints; namespace RelayCore.Endpoints;
@@ -33,9 +34,18 @@ public static class AuthEndpoints
var token = await service.UserRegisterAsync(request, ip, userAgent); var token = await service.UserRegisterAsync(request, ip, userAgent);
return token != null ? Results.Ok(token) : Results.Ok("Username or Email already exists!"); return token != null ? Results.Ok(token) : Results.Ok("Username or Email already exists!");
}); });
app.MapPost("/user/isAlive", async (AuthSignin request, HttpContext context) =>
{
var ip = context.Connection.RemoteIpAddress?.MapToIPv4().ToString();
context.Request.Headers.TryGetValue("User-Agent", out var userAgent);
Console.WriteLine($"UN: {request.UserName}\nToken: {request.Password}\nIP: {ip}\nUserAgent: {userAgent}");
return Results.Ok();
});
app.MapPost("/server/verify/user", async (AuthUserVerify request, APIAuthService service) => app.MapPost("/server/verify/user", async (AuthUserVerify request, APIAuthService service) =>
{ {
bool valid = await service.ServerVerifyUser(request); bool valid = await service.ServerVerifyUser(request);
Console.WriteLine($"UN: {request.Username}\nToken: {request.Token}");
return Results.Ok(valid); return Results.Ok(valid);
}); });
app.MapPost("/server/verify/license", async (AuthServerLicense request, APIAuthService service) => app.MapPost("/server/verify/license", async (AuthServerLicense request, APIAuthService service) =>
@@ -44,27 +54,3 @@ public static class AuthEndpoints
}); });
} }
} }
public class AuthSignin
{
public string UserName { get; set; }
public string Password { get; set; }
}
public class AuthRegister
{
public string Username { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
public class AuthUserVerify
{
public string Username { get; set; }
public string Token { get; set; }
}
public class AuthServerLicense
{
public string License { get; set; }
}

View File

@@ -25,7 +25,8 @@ Console.WriteLine($"Kira created: {ToJsonString(kira)}");
Console.WriteLine($"Test created: {ToJsonString(test)}"); Console.WriteLine($"Test created: {ToJsonString(test)}");
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls("http://127.0.0.1:1337/"); // builder.WebHost.UseUrls("http://127.0.0.1:1337/");
builder.WebHost.UseUrls("http://192.168.1.85:1337");
builder.Services.AddSingleton(db); builder.Services.AddSingleton(db);
builder.Services.AddScoped<APIAuthService>(); builder.Services.AddScoped<APIAuthService>();

View File

@@ -2,6 +2,7 @@
using RelayCore.Endpoints; using RelayCore.Endpoints;
using RelayCore.Enums; using RelayCore.Enums;
using RelayCore.Models; using RelayCore.Models;
using RelayShared.Services;
using SurrealDb.Net; using SurrealDb.Net;
using SurrealDb.Net.Models; using SurrealDb.Net.Models;

View File

@@ -21,7 +21,8 @@ var bootstrapService = new ServerBootstrapService(db, coreClient, cryptoService)
await bootstrapService.InitializeAsync(); await bootstrapService.InitializeAsync();
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.WebHost.UseUrls("http://127.0.0.1:5000/"); // builder.WebHost.UseUrls("http://127.0.0.1:5000/");
builder.WebHost.UseUrls("http://192.168.1.85:5000/");
builder.Services.AddSingleton(db); builder.Services.AddSingleton(db);
builder.Services.AddScoped<RtcCallService>(); builder.Services.AddScoped<RtcCallService>();
@@ -31,7 +32,8 @@ var app = builder.Build();
app.MapGet("/", () => "Server Running!"); app.MapGet("/", () => "Server Running!");
app.MapRtcEndpoints(); app.MapRtcEndpoints();
var wssv = new WebSocketServer("ws://localhost:1337"); // var wssv = new WebSocketServer("ws://127.0.0.1:5001");
var wssv = new WebSocketServer("ws://192.168.1.85:5001");
wssv.AddWebSocketService<ChatSocketBehavior>("/"); wssv.AddWebSocketService<ChatSocketBehavior>("/");
RtcNotificationService.Server = wssv; RtcNotificationService.Server = wssv;

View File

@@ -1,4 +1,5 @@
using System.Text.Json; using System.Net.Http.Headers;
using System.Text.Json;
using RelayServer.Models; using RelayServer.Models;
using RelayServer.Services.Crypto; using RelayServer.Services.Crypto;
using RelayServer.Services.Data; using RelayServer.Services.Data;
@@ -39,6 +40,12 @@ public class ChatSocketBehavior : WebSocketBehavior
return; return;
} }
if (msg.StartsWith("AUTHENTICATE_USER"))
{
HandleAuth(msg);
return;
}
if (msg == "GET_SERVER_KEY") if (msg == "GET_SERVER_KEY")
{ {
HandleGetServerKey(); HandleGetServerKey();
@@ -98,6 +105,34 @@ public class ChatSocketBehavior : WebSocketBehavior
} }
} }
private async void HandleAuth(string msg)
{
var parts = msg.Split('|', 3);
if (parts.Length < 3)
{
Console.WriteLine("Invalid AUTHENTICATE_USERS payload.");
return;
}
var username = parts[1];
var token = parts[2];
// HttpClient core = new HttpClient{BaseAddress = new Uri("http://127.0.0.1:1337")};
HttpClient core = new HttpClient{BaseAddress = new Uri("http://192.168.1.85:1337")};
core.DefaultRequestHeaders.Accept.Clear();
core.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
core.DefaultRequestHeaders.Add("User-Agent", "RelayServer");
HttpResponseMessage response = await core.PostAsJsonAsync("/server/verify/user", new AuthUserVerify
{
Username = username,
Token = token
});
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
}
private void HandleEncryptedRtcSignal(string msg) private void HandleEncryptedRtcSignal(string msg)
{ {
Console.WriteLine("RTC SIGNAL HIT"); Console.WriteLine("RTC SIGNAL HIT");

View File

@@ -0,0 +1,25 @@
namespace RelayShared.Services;
public class AuthSignin
{
public string UserName { get; set; }
public string Password { get; set; }
}
public class AuthRegister
{
public string Username { get; set; }
public string Password { get; set; }
public string Email { get; set; }
}
public class AuthUserVerify
{
public string Username { get; set; }
public string Token { get; set; }
}
public class AuthServerLicense
{
public string License { get; set; }
}