WIP still, tuning up auth and room wildcard with middleware

This commit is contained in:
Nate Anderson
2025-02-02 19:49:11 -07:00
parent 37e168e46b
commit 544d3b45ba
18 changed files with 369 additions and 94 deletions
@@ -1,17 +0,0 @@
import 'package:backend/authenticator.dart';
import 'package:backend/database.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:dart_frog_auth/dart_frog_auth.dart';
Handler middleware(Handler handler) {
return handler.use(
bearerAuthentication<User>(
authenticator: (context, token) async {
final authenticator = context.read<Authenticator>();
return authenticator.verifyToken(token);
},
// says to apply the middleware to all routes
applies: (_) async => true,
),
);
}
+3 -10
View File
@@ -1,15 +1,8 @@
// lib/routes/tasks/_middleware.dart
import 'package:backend/middleware/auth_middleware.dart';
import 'package:backend/middleware/logger.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:logging/logging.dart';
final log = Logger('');
Handler middleware(Handler handler) {
return handler.use(
(handler) => (context) async {
final request = context.request;
log.info('${request.method.value} ${request.uri.path}');
return await handler(context);
},
);
return handler.use(loggerMiddleware()).use(authenticatorMiddlewareProvider());
}
+21 -11
View File
@@ -2,9 +2,11 @@ import 'dart:io';
import 'package:backend/authenticator.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:logging/logging.dart';
import 'package:shared_models/user.dart';
final log = Logger('auth/');
Future<Response> onRequest(RequestContext context) async {
// Only allow POST requests
if (context.request.method != HttpMethod.post) {
@@ -18,28 +20,36 @@ Future<Response> onRequest(RequestContext context) async {
// Generate token
final authenticator = context.read<Authenticator>();
final token = await authenticator.generateToken(username: createUserReq.username);
final token = await authenticator.generateToken(createUserReq);
if (token == null) {
final body = CreateUserResponse(
success: false,
token: null,
error: 'Room ${createUserReq.roomCode} requested is not available',
).toJson();
return Response.json(
statusCode: HttpStatus.internalServerError,
body: {'error': 'Failed to generate token'},
statusCode: HttpStatus.badRequest,
body: body,
);
}
// Return the token
return Response.json(
body: {'token': token},
);
} on JWTParseException {
return Response.json(
statusCode: HttpStatus.badRequest,
body: {'error': 'Username is required'},
body: CreateUserResponse(token: token, success: true).toJson(),
);
// }
// on JWTParseException {
// return Response.json(
// statusCode: HttpStatus.badRequest,
// body: {'error': 'Username is required'},
// );
} catch (e) {
log.severe('Error:', e);
final body = CreateUserResponse(success: false, token: null, error: 'Internal server error').toJson();
return Response.json(
statusCode: HttpStatus.internalServerError,
body: {'error': 'Internal server error'},
body: body,
);
}
}
+42
View File
@@ -0,0 +1,42 @@
import 'dart:io';
import 'dart:math';
import 'package:backend/service/db_access.dart';
import 'package:dart_frog/dart_frog.dart';
import 'package:logging/logging.dart';
import 'package:shared_models/room.dart';
final log = Logger('create_room');
Future<Response> onRequest(RequestContext context) async {
// Only allow POST requests
if (context.request.method != HttpMethod.post) {
return Response(statusCode: HttpStatus.methodNotAllowed);
}
try {
// Generate a random 6-letter room code
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
final random = Random();
final roomCode = String.fromCharCodes(
Iterable.generate(
6,
(_) => chars.codeUnitAt(random.nextInt(chars.length)),
),
);
// Create the room
final room = await Db.createRoom(roomCode: roomCode);
// Return the room code
return Response.json(
body: CreateRoomResponse(success: true, roomCode: room.code).toJson(),
);
} catch (e) {
log.severe('Error:', e);
return Response.json(
statusCode: HttpStatus.internalServerError,
body: CreateRoomResponse(success: false, roomCode: null, error: 'Internal server error').toJson(),
);
}
}
@@ -0,0 +1,7 @@
import 'package:backend/middleware/auth_middleware.dart';
import 'package:dart_frog/dart_frog.dart';
// Middleware to check for jwt tokens on all routes under /room/[roomCode]/
Handler middleware(Handler handler) {
return handler.use(tokenAuthMiddleware());
}