JWTDriver.fromConfig constructor

JWTDriver.fromConfig(
  1. AuthConfig config,
  2. String providerKey, {
  3. TokenGenerator? tokenGenerator,
  4. TokenService? tokenService,
  5. TokenInvalidationStrategyFactory? strategyFactory,
})

Factory constructor with config and dependency injection

Implementation

factory JWTDriver.fromConfig(
  AuthConfig config,
  String providerKey, {
  TokenGenerator? tokenGenerator,
  TokenService? tokenService,
  TokenInvalidationStrategyFactory? strategyFactory,
}) {
  final provider = config.getProvider(providerKey);
  final driverConfig = config.getDriver('jwt');
  final secret =
      (provider['jwt_secret'] ?? driverConfig['jwt_secret']) as String?;

  if (secret == null || secret.isEmpty || secret == 'default-secret-key') {
    throw const FormatException(
      'JWT secret key must be configured and cannot be the default value. '
      'Please set a secure JWT secret in your auth configuration.',
    );
  }

  final accessSeconds = (provider['access_token_expiry'] ??
      driverConfig['access_token_expiry']) as int?;
  final accessExpiry = Duration(seconds: accessSeconds ?? 3600);

  final refreshSeconds = (provider['refresh_token_expiry'] ??
      driverConfig['refresh_token_expiry']) as int?;
  final refreshExpiry = Duration(seconds: refreshSeconds ?? 604800);

  // Create token service instance first to ensure it's not null
  late final TokenService tokenServiceInstance;
  try {
    tokenServiceInstance = tokenService ?? DatabaseTokenService();
  } catch (e) {
    throw StateError(
      'Failed to create TokenService: $e. '
      'Ensure database connection is initialized before creating auth driver.',
    );
  }

  // Create strategy factory with the guaranteed non-null service
  late final TokenInvalidationStrategyFactory strategyFactoryInstance;
  try {
    strategyFactoryInstance = strategyFactory ??
        TokenInvalidationStrategyFactory(tokenServiceInstance);
  } catch (e) {
    throw StateError(
      'Failed to create TokenInvalidationStrategyFactory: $e',
    );
  }

  return JWTDriver(
    secret: secret,
    accessTokenExpiry: accessExpiry,
    refreshTokenExpiry: refreshExpiry,
    tokenGenerator: tokenGenerator,
    tokenService: tokenServiceInstance,
    strategyFactory: strategyFactoryInstance,
    config: config,
    providerKey: providerKey,
  );
}