using backend.Data; using backend.Devices; using Microsoft.EntityFrameworkCore; namespace backend.DeviceHub; public class DeviceAuth(AppDbContext db, DeviceTokenService tokens) { public async Task AuthenticateAsync(string? authHeader, CancellationToken ct) { if (string.IsNullOrEmpty(authHeader)) return null; const string prefix = "Bearer "; if (!authHeader.StartsWith(prefix, StringComparison.Ordinal)) return null; var token = authHeader[prefix.Length..].Trim(); if (string.IsNullOrEmpty(token)) return null; var hash = tokens.Hash(token); var device = await db.Devices.Include(d => d.Config) .FirstOrDefaultAsync(d => d.TokenHash == hash && !d.IsRevoked, ct); return device; } }