22using CodeBeam . UltimateAuth . Core . Contracts ;
33using CodeBeam . UltimateAuth . Server . Abstractions ;
44using CodeBeam . UltimateAuth . Server . Contracts ;
5+ using CodeBeam . UltimateAuth . Server . Cookies ;
56using CodeBeam . UltimateAuth . Server . Endpoints ;
67using CodeBeam . UltimateAuth . Server . Extensions ;
78using CodeBeam . UltimateAuth . Server . MultiTenancy ;
@@ -13,26 +14,39 @@ public sealed class DefaultLoginEndpointHandler<TUserId> : ILoginEndpointHandler
1314 private readonly IDeviceResolver _deviceResolver ;
1415 private readonly ITenantResolver _tenantResolver ;
1516 private readonly IClock _clock ;
17+ private readonly IUAuthSessionCookieManager _cookieManager ;
1618
1719 public DefaultLoginEndpointHandler (
1820 IUAuthFlowService < TUserId > flow ,
1921 IDeviceResolver deviceResolver ,
2022 ITenantResolver tenantResolver ,
21- IClock clock )
23+ IClock clock ,
24+ IUAuthSessionCookieManager cookieManager )
2225 {
2326 _flow = flow ;
2427 _deviceResolver = deviceResolver ;
2528 _tenantResolver = tenantResolver ;
2629 _clock = clock ;
30+ _cookieManager = cookieManager ;
2731 }
2832
2933 public async Task < IResult > LoginAsync ( HttpContext ctx )
3034 {
31- var request = await ctx . Request . ReadFromJsonAsync < LoginRequest > ( ) ;
32- if ( request is null )
33- return Results . BadRequest ( "Invalid login request." ) ;
35+ if ( ! ctx . Request . HasFormContentType )
36+ return Results . BadRequest ( "Invalid content type." ) ;
37+
38+ var form = await ctx . Request . ReadFormAsync ( ) ;
39+
40+ var request = new LoginRequest
41+ {
42+ Identifier = form [ "Identifier" ] ,
43+ Secret = form [ "Secret" ]
44+ } ;
45+
46+ if ( string . IsNullOrWhiteSpace ( request . Identifier ) ||
47+ string . IsNullOrWhiteSpace ( request . Secret ) )
48+ return Results . Redirect ( "/login?error=invalid" ) ;
3449
35- // Middleware should have already resolved the tenant
3650 var tenantCtx = ctx . GetTenantContext ( ) ;
3751
3852 var flowRequest = request with
@@ -44,23 +58,54 @@ public async Task<IResult> LoginAsync(HttpContext ctx)
4458
4559 var result = await _flow . LoginAsync ( flowRequest , ctx . RequestAborted ) ;
4660
47- return result . Status switch
48- {
49- LoginStatus . Success => Results . Ok ( new LoginResponse
50- {
51- SessionId = result . SessionId ,
52- AccessToken = result . AccessToken ,
53- RefreshToken = result . RefreshToken
54- } ) ,
55-
56- LoginStatus . RequiresContinuation => Results . Ok ( new LoginResponse
57- {
58- Continuation = result . Continuation
59- } ) ,
61+ if ( ! result . IsSuccess )
62+ return Results . Redirect ( "/login?error=invalid" ) ;
6063
61- LoginStatus . Failed => Results . Unauthorized ( ) ,
64+ _cookieManager . Issue ( ctx , result . SessionId ! . Value ) ;
6265
63- _ => Results . StatusCode ( StatusCodes . Status500InternalServerError )
64- } ;
66+ return Results . Redirect ( "/" ) ;
6567 }
68+
69+ //public async Task<IResult> LoginAsync(HttpContext ctx)
70+ //{
71+ // var request = await ctx.Request.ReadFromJsonAsync<LoginRequest>();
72+ // if (request is null)
73+ // return Results.BadRequest("Invalid login request.");
74+
75+ // // Middleware should have already resolved the tenant
76+ // var tenantCtx = ctx.GetTenantContext();
77+
78+ // var flowRequest = request with
79+ // {
80+ // TenantId = tenantCtx.TenantId,
81+ // At = _clock.UtcNow,
82+ // DeviceInfo = _deviceResolver.Resolve(ctx)
83+ // };
84+
85+ // var result = await _flow.LoginAsync(flowRequest, ctx.RequestAborted);
86+
87+ // if (result.IsSuccess)
88+ // {
89+ // _cookieManager.Issue(ctx, result.SessionId.Value);
90+ // }
91+
92+ // return result.Status switch
93+ // {
94+ // LoginStatus.Success => Results.Ok(new LoginResponse
95+ // {
96+ // SessionId = result.SessionId,
97+ // AccessToken = result.AccessToken,
98+ // RefreshToken = result.RefreshToken
99+ // }),
100+
101+ // LoginStatus.RequiresContinuation => Results.Ok(new LoginResponse
102+ // {
103+ // Continuation = result.Continuation
104+ // }),
105+
106+ // LoginStatus.Failed => Results.Unauthorized(),
107+
108+ // _ => Results.StatusCode(StatusCodes.Status500InternalServerError)
109+ // };
110+ //}
66111}
0 commit comments