diff --git a/Astral.ApiServer/Astral.ApiServer.csproj b/Astral.ApiServer/Astral.ApiServer.csproj
index 7f8c717..4b02de7 100644
--- a/Astral.ApiServer/Astral.ApiServer.csproj
+++ b/Astral.ApiServer/Astral.ApiServer.csproj
@@ -21,10 +21,6 @@
-
-
-
-
diff --git a/Astral.ApiServer/Constants/OAuthGrantTypes.cs b/Astral.ApiServer/Constants/OAuthGrantTypes.cs
new file mode 100644
index 0000000..2e7c827
--- /dev/null
+++ b/Astral.ApiServer/Constants/OAuthGrantTypes.cs
@@ -0,0 +1,16 @@
+//
+// Copyright (c) alveus.dev. All rights reserved. Licensed under the MIT License.
+//
+
+namespace Astral.ApiServer.Constants;
+
+///
+/// Available grant types for auth token requests.
+///
+public static class OAuthGrantTypes
+{
+ ///
+ /// Password grant type.
+ ///
+ public const string Password = "password";
+}
diff --git a/Astral.ApiServer/Controllers/OAuthController.cs b/Astral.ApiServer/Controllers/OAuthController.cs
new file mode 100644
index 0000000..8c701e3
--- /dev/null
+++ b/Astral.ApiServer/Controllers/OAuthController.cs
@@ -0,0 +1,29 @@
+//
+// Copyright (c) alveus.dev. All rights reserved. Licensed under the MIT License.
+//
+
+using Astral.ApiServer.Models;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+
+namespace Astral.ApiServer.Controllers;
+
+///
+/// OAuth authentication controller.
+///
+[Produces("application/json")]
+[Consumes("application/x-www-form-urlencoded")]
+[Route("oauth")]
+public class OAuthController : ControllerBase
+{
+ ///
+ /// Grant token request.
+ ///
+ /// Instance of .
+ [HttpPost("token")]
+ [AllowAnonymous]
+ public Task GrantToken([FromForm] TokenGrantRequestModel tokenGrantRequest)
+ {
+ throw new NotImplementedException();
+ }
+}
diff --git a/Astral.ApiServer/Models/TokenGrantRequestModel.cs b/Astral.ApiServer/Models/TokenGrantRequestModel.cs
new file mode 100644
index 0000000..9c9104d
--- /dev/null
+++ b/Astral.ApiServer/Models/TokenGrantRequestModel.cs
@@ -0,0 +1,43 @@
+//
+// Copyright (c) alveus.dev. All rights reserved. Licensed under the MIT License.
+//
+
+using Microsoft.AspNetCore.Mvc;
+
+namespace Astral.ApiServer.Models;
+
+///
+/// Oauth token grant request.
+///
+public class TokenGrantRequestModel
+{
+ ///
+ /// The grant type of the request.
+ ///
+ [FromForm(Name = "grant_type")]
+ public string GrantType { get; set; }
+
+ ///
+ /// Refresh token.
+ ///
+ [FromForm(Name = "refresh_token")]
+ public string RefreshToken { get; set; }
+
+ ///
+ /// Username.
+ ///
+ [FromForm(Name = "username")]
+ public string Username { get; set; }
+
+ ///
+ /// Password.
+ ///
+ [FromForm(Name = "password")]
+ public string Password { get; set; }
+
+ ///
+ /// Scope.
+ ///
+ [FromForm(Name = "scope")]
+ public string Scope { get; set; }
+}
diff --git a/Astral.ApiServer/Models/TokenGrantResponseModel.cs b/Astral.ApiServer/Models/TokenGrantResponseModel.cs
new file mode 100644
index 0000000..b36bf1f
--- /dev/null
+++ b/Astral.ApiServer/Models/TokenGrantResponseModel.cs
@@ -0,0 +1,37 @@
+//
+// Copyright (c) alveus.dev. All rights reserved. Licensed under the MIT License.
+//
+
+using System.Text.Json.Serialization;
+
+namespace Astral.ApiServer.Models;
+
+///
+/// OAuth Grant Request Response.
+///
+public class TokenGrantResponseModel
+{
+ ///
+ /// The granted access token.
+ ///
+ [JsonPropertyName("access_token")]
+ public string AccessToken { get; set; }
+
+ ///
+ /// The granted refresh token.
+ ///
+ [JsonPropertyName("refresh_token")]
+ public string RefreshToken { get; set; }
+
+ ///
+ /// When it expires (ticks).
+ ///
+ [JsonPropertyName("expires_in")]
+ public long ExpiresIn { get; set; }
+
+ ///
+ /// Granted token type.
+ ///
+ [JsonPropertyName("token_type")]
+ public string TokenType { get; set; }
+}
diff --git a/Astral.Services/Services/UserService.cs b/Astral.Services/Services/UserService.cs
index 1b1d747..6828bd1 100644
--- a/Astral.Services/Services/UserService.cs
+++ b/Astral.Services/Services/UserService.cs
@@ -38,13 +38,13 @@ public class UserService : IUserService
///
/// Initializes a new instance of the class.
///
- /// Instance of .
- /// Instance of .
- /// Instance of .
- /// Instance of .
/// Instance of .
+ /// Instance of .
+ /// Instance of .
/// Instance of .
+ /// Instance of .
/// Instance of .
+ /// Instance of .
/// Instance of .
/// Instance of .
public UserService(