Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions packages/amplify_core/lib/src/amplify_class.dart
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,9 @@ abstract class AmplifyClass {

/// Configures all plugins in topologically-sorted order.
Future<void> _configurePlugins(AmplifyOutputs config) async {
safePrint(
'⚙️ [Amplify Core] Configuring plugins with AuthOutputs.userPoolEndpoint: ${config.auth?.userPoolEndpoint}',
);
await Future.wait(_addPluginFutures);
_addPluginFutures.clear();
final categories = <Category, AmplifyCategory>{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class AuthOutputs
required this.awsRegion,
this.userPoolId,
this.userPoolClientId,
this.userPoolEndpoint,
this.appClientSecret,
this.identityPoolId,
this.passwordPolicy,
Expand All @@ -44,6 +45,9 @@ class AuthOutputs
/// The Cognito User Pool Client ID.
final String? userPoolClientId;

/// The Cognito User Pool Endpoint.
final String? userPoolEndpoint; //Gen 1 only

/// A fixed string that must be used in all API requests to the app client
/// if the the app client has one configured.
///
Expand Down Expand Up @@ -81,18 +85,20 @@ class AuthOutputs

@override
List<Object?> get props => [
awsRegion,
userPoolId,
userPoolClientId,
identityPoolId,
oauth,
standardRequiredAttributes,
usernameAttributes,
userVerificationTypes,
unauthenticatedIdentitiesEnabled,
mfaConfiguration,
mfaMethods,
];
awsRegion,
userPoolId,
userPoolClientId,
userPoolEndpoint,
appClientSecret,
identityPoolId,
oauth,
standardRequiredAttributes,
usernameAttributes,
userVerificationTypes,
unauthenticatedIdentitiesEnabled,
mfaConfiguration,
mfaMethods,
];

@override
String get runtimeTypeName => 'AuthOutputs';
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 18 additions & 1 deletion packages/amplify_core/lib/src/config/auth/auth_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,22 @@ class AuthConfig extends AmplifyPluginConfigMap {
responseType: OAuthResponseType.code,
)
: null;
final endpoint = userPool?.endpoint;
if (endpoint != null) {
safePrint(
'📋 [Auth Config] Gen 1 config contains Endpoint: $endpoint',
);
} else {
safePrint(
'📋 [Auth Config] No Endpoint found in Gen 1 config',
);
}

return AuthOutputs(
final authOutputs = AuthOutputs(
awsRegion: region,
userPoolId: userPool?.poolId,
userPoolClientId: userPool?.appClientId,
userPoolEndpoint: endpoint,
appClientSecret: userPool?.appClientSecret,
identityPoolId: identityPool?.poolId,
passwordPolicy: passwordPolicy,
Expand All @@ -147,6 +158,12 @@ class AuthConfig extends AmplifyPluginConfigMap {
mfaConfiguration: plugin?.mfaConfiguration?.toMfaEnforcement(),
mfaMethods: plugin?.mfaTypes?.map((t) => t.toMfaMethod()).toList(),
);

safePrint(
'📤 [Auth Config] Created AuthOutputs with userPoolEndpoint: ${authOutputs.userPoolEndpoint}',
);

return authOutputs;
}

@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ class CognitoUserPoolConfig
appClientId: authOutputs.userPoolClientId!,
appClientSecret: authOutputs.appClientSecret,
region: authOutputs.awsRegion,
endpoint: authOutputs.userPoolEndpoint,
hostedUI: authOutputs.oauth == null
? null
: CognitoOAuthConfig.fromAuthOutputs(authOutputs),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,22 @@ void main() {
expect(mappedOutputs.auth?.appClientSecret, appClientSecret);
});

test(
'maps config with only the required options for a user pool',
() async {
final configJson =
jsonDecode(userPoolOnlyConfig) as Map<String, Object?>;
final amplifyConfig = AmplifyConfig.fromJson(configJson);
final mappedOutputs = amplifyConfig.toAmplifyOutputs();
expect(mappedOutputs.auth?.passwordPolicy, null);
},
);
test('maps config with only the required options for a user pool',
() async {
final configJson =
jsonDecode(userPoolOnlyConfig) as Map<String, Object?>;
final amplifyConfig = AmplifyConfig.fromJson(configJson);
final mappedOutputs = amplifyConfig.toAmplifyOutputs();
expect(mappedOutputs.auth?.passwordPolicy, null);
});

test('maps config with user pool endpoint', () async {
final configJson =
jsonDecode(endpointConfig) as Map<String, Object?>;
final amplifyConfig = AmplifyConfig.fromJson(configJson);
final mappedOutputs = amplifyConfig.toAmplifyOutputs();
expect(mappedOutputs.auth?.userPoolEndpoint, userPoolEndpoint);
});
});
});
}
Expand Down Expand Up @@ -259,3 +265,40 @@ Map<String, Object?> updateConfig(Map<String, Object?> config) {
defaultAuth['socialProviders'] = ['GOOGLE', 'FACEBOOK', 'AMAZON', 'APPLE'];
return config;
}

const userPoolEndpoint = 'https://fake-user-pool-endpoint.com';

const endpointConfig = r'''{
"UserAgent": "aws-amplify-cli/2.0",
"Version": "1.0",
"auth": {
"plugins": {
"awsCognitoAuthPlugin": {
"IdentityManager": {
"Default": {}
},
"CredentialsProvider": {
"CognitoIdentity": {
"Default": {
"PoolId": "fake-pool-id",
"Region": "us-east-1"
}
}
},
"CognitoUserPool": {
"Default": {
"PoolId": "fake-pool-id",
"AppClientId": "fake-client-id",
"Region": "us-east-1",
"Endpoint": "https://fake-user-pool-endpoint.com"
}
},
"Auth": {
"Default": {
"authenticationFlowType": "USER_SRP_AUTH"
}
}
}
}
}
}''';

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -515,6 +515,10 @@ class AmplifyAuthCognitoDart extends AuthPluginInterface
String? password,
SignInOptions? options,
}) async {
safePrint(
'🔐 [Auth Plugin] signIn called with username: $username (password provided: ${password != null})',
);

final pluginOptions = reifyPluginOptions(
pluginOptions: options?.pluginOptions,
defaultPluginOptions: const CognitoSignInPluginOptions(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,26 @@ class WrappedCognitoIdentityProviderClient
WithHeader(AWSHeaders.cacheControl, 'no-store'),
],
),
_dependencyManager = dependencyManager;
_dependencyManager = dependencyManager {
safePrint('🌐 [SDK Bridge] WrappedCognitoIdentityProviderClient constructor called');
safePrint('🌐 [SDK Bridge] region: $region, endpoint parameter: $endpoint');

// Log the actual baseUri being used
final baseUri = endpoint == null
? null
: (endpoint.startsWith('http')
? Uri.parse(endpoint)
: Uri.parse('https://$endpoint'));
if (baseUri != null) {
safePrint(
'🌐 [Cognito SDK] Using custom baseUri: $baseUri',
);
} else {
safePrint(
'🌐 [Cognito SDK] Using default AWS Cognito endpoint for region: $region',
);
}
}

final DependencyManager _dependencyManager;
final CognitoIdentityProviderClient _base;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,17 +67,37 @@ final class ConfigurationStateMachine

/// State machine callback for the [Configure] event.
Future<void> onConfigure(Configure event) async {
safePrint('🔧 [Configuration State Machine] onConfigure called');

final authOutputs = event.config.auth;
if (authOutputs == null) {
throw ConfigurationError('No Cognito plugin config available');
}

safePrint('🔧 [Configuration State Machine] AuthOutputs found - userPoolEndpoint: ${authOutputs.userPoolEndpoint}');

addInstance(authOutputs);
final waiters = <Future<void>>[];

// Log endpoint configuration
if (authOutputs.userPoolEndpoint != null) {
safePrint(
'🔧 [Amplify Auth] Configuring Cognito with custom endpoint: ${authOutputs.userPoolEndpoint}',
);
} else {
safePrint(
'🔧 [Amplify Auth] Configuring Cognito with default AWS endpoint (no custom endpoint set)',
);
}

safePrint('🔧 [Configuration State Machine] Creating WrappedCognitoIdentityProviderClient with endpoint: ${authOutputs.userPoolEndpoint}');

addInstance<CognitoIdentityProviderClient>(
WrappedCognitoIdentityProviderClient(
region: authOutputs.awsRegion,
credentialsProvider: _credentialsProvider,
dependencyManager: this,
endpoint: authOutputs.userPoolEndpoint,
),
);

Expand Down