login method
- {bool forceLogin = false}
Logs the user Forces the user to enter their credentials to ensure the correct users account is authorized.
Implementation
Future<AuthResult> login({bool forceLogin = false}) async {
try {
final requestToken = await RequestToken.getRequestToken(
apiKey,
apiSecretKey,
redirectURI,
forceLogin,
);
String resultURI = '';
if (Platform.isIOS) {
resultURI = await _channel.invokeMethod('authentication', {
'url': requestToken.authorizeURI,
'redirectURL': redirectURI,
});
} else if (Platform.isAndroid) {
final uri = Uri.parse(redirectURI);
await _channel.invokeMethod('setScheme', uri.scheme);
final completer = Completer<String>();
final subscribe = _eventStream.listen((data) async {
if (data['type'] == 'url') {
completer.complete(data['url']?.toString());
}
});
final browser = ChromeCustomTab(onClose: () {
if (!completer.isCompleted) {
completer.complete(null);
}
});
await browser.open(url: requestToken.authorizeURI);
resultURI = await completer.future;
subscribe.cancel();
} else {
throw UnsupportedError('Not supported by this os.');
}
final queries = Uri.splitQueryString(Uri.parse(resultURI).query);
if (queries['error'] != null) {
throw Exception('Error Response: ${queries['error']}');
}
// The user cancelled the login flow.
if (queries['denied'] != null) {
throw CanceldByUserException();
}
final accessToken = await AccessToken.getAccessToken(
apiKey,
apiSecretKey,
queries,
);
final userData = await User.getUserData(
apiKey,
apiSecretKey,
accessToken.authToken,
accessToken.authTokenSecret,
);
return AuthResult(
accessToken: accessToken,
authToken: accessToken.authToken,
authTokenSecret: accessToken.authTokenSecret,
status: TwitterLoginStatus.loggedIn,
errorMessage: '',
user: userData,
);
} on CanceldByUserException {
return AuthResult(
accessToken: null,
authToken: null,
authTokenSecret: null,
status: TwitterLoginStatus.cancelledByUser,
errorMessage: 'The user cancelled the login flow',
user: null,
);
} catch (error) {
return AuthResult(
accessToken: null,
authToken: null,
authTokenSecret: null,
status: TwitterLoginStatus.error,
errorMessage: error.toString(),
user: null,
);
}
}