Allows dynamic config resolution (e.g. test mocks that change config between calls). Options can now be string | (() => string) for both jwtSecret and jwksUrl.
- createAuthMiddleware(): RS256 JWKS + HS256 fallback (parameterized) - createRequestContext(): productId validation + getUserId() - Fastify request type augmentation for jwtPayload - 15 tests passing