validateOAuthConfig static method
Validates a complete OAuth2 configuration
Implementation
static ValidationResult validateOAuthConfig(OAuthConfig config) {
final allIssues = <String>[];
final suggestions = <String>[];
// Validate base URL
final baseUrlIssues = UrlBuilder.validateBaseUrl(config.baseUrl);
allIssues.addAll(baseUrlIssues);
if (baseUrlIssues.isNotEmpty) {
suggestions.add('Ensure base URL is in format: https://your-site.frappe.cloud');
}
// Validate client ID
final clientIdIssues = UrlBuilder.validateClientId(config.clientId);
allIssues.addAll(clientIdIssues);
if (clientIdIssues.isNotEmpty) {
suggestions.add('Check your Frappe OAuth2 client configuration');
}
// Validate redirect scheme
final schemeIssues = UrlBuilder.validateRedirectScheme(config.redirectScheme);
allIssues.addAll(schemeIssues);
if (schemeIssues.isNotEmpty) {
suggestions.add('Use a unique app identifier as redirect scheme (e.g., "myapp")');
}
// Validate scopes
final scopeIssues = UrlBuilder.validateScopes(config.scopes);
allIssues.addAll(scopeIssues);
if (scopeIssues.isNotEmpty) {
suggestions.add('Use valid Frappe scopes like "all", "openid", "profile"');
}
// Validate redirect URI
final redirectUriIssues = UrlBuilder.validateRedirectUri(config.redirectUri);
allIssues.addAll(redirectUriIssues);
// Validate timeouts
if (config.tokenRefreshThreshold.isNegative) {
allIssues.add('Token refresh threshold cannot be negative');
suggestions.add('Set token refresh threshold to at least 1 minute');
}
if (config.networkTimeout.inSeconds < 1) {
allIssues.add('Network timeout must be at least 1 second');
suggestions.add('Set network timeout to at least 10 seconds');
}
// Validate custom endpoints if provided
if (config.customAuthorizationEndpoint != null) {
final authEndpointIssues = _validateUrl(config.customAuthorizationEndpoint!);
allIssues.addAll(authEndpointIssues.map((issue) => 'Authorization endpoint: $issue'));
}
if (config.customTokenEndpoint != null) {
final tokenEndpointIssues = _validateUrl(config.customTokenEndpoint!);
allIssues.addAll(tokenEndpointIssues.map((issue) => 'Token endpoint: $issue'));
}
if (config.customUserInfoEndpoint != null) {
final userInfoEndpointIssues = _validateUrl(config.customUserInfoEndpoint!);
allIssues.addAll(userInfoEndpointIssues.map((issue) => 'User info endpoint: $issue'));
}
if (allIssues.isEmpty) {
return ValidationResult.success(
context: {
'configType': 'oauth2',
'validatedAt': DateTime.now().toIso8601String(),
},
);
}
return ValidationResult.failure(
issues: allIssues,
suggestions: suggestions,
context: {
'configType': 'oauth2',
'validatedAt': DateTime.now().toIso8601String(),
'issueCount': allIssues.length,
},
);
}