Skip to content
Open
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
1 change: 1 addition & 0 deletions flutter_appauth/ios/Classes/FlutterAppAuth.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ static NSString *const AUTHORIZE_METHOD = @"authorize";
static NSString *const AUTHORIZE_AND_EXCHANGE_CODE_METHOD = @"authorizeAndExchangeCode";
static NSString *const TOKEN_METHOD = @"token";
static NSString *const END_SESSION_METHOD = @"endSession";
static NSString *const PROCESS_CALLBACK = @"processCallback";
static NSString *const AUTHORIZE_ERROR_CODE = @"authorize_failed";
static NSString *const AUTHORIZE_AND_EXCHANGE_CODE_ERROR_CODE = @"authorize_and_exchange_code_failed";
static NSString *const DISCOVERY_ERROR_CODE = @"discovery_failed";
Expand Down
8 changes: 8 additions & 0 deletions flutter_appauth/ios/Classes/FlutterAppauthPlugin.m
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ - (void)handleMethodCall:(FlutterMethodCall*)call result:(FlutterResult)result {
[self handleTokenMethodCall:[call arguments] result:result];
} else if([END_SESSION_METHOD isEqualToString:call.method]) {
[self handleEndSessionMethodCall:[call arguments] result:result];
} else if([PROCESS_CALLBACK isEqualToString:call.method]) {
[self processCallback:[call arguments] result:result];
} else {
result(FlutterMethodNotImplemented);
}
Expand Down Expand Up @@ -260,6 +262,12 @@ -(void)handleEndSessionMethodCall:(NSDictionary*)arguments result:(FlutterResult
}
}

- (void) processCallback:(NSDictionary*)arguments result:(FlutterResult)result {
NSString *url = [arguments valueForKey:@"url"];
[_currentAuthorizationFlow resumeExternalUserAgentFlowWithURL:url];
_currentAuthorizationFlow = nil;
}

- (void)performTokenRequest:(OIDServiceConfiguration *)serviceConfiguration requestParameters:(TokenRequestParameters *)requestParameters result:(FlutterResult)result {
OIDTokenRequest *tokenRequest =
[[OIDTokenRequest alloc] initWithConfiguration:serviceConfiguration
Expand Down
7 changes: 5 additions & 2 deletions flutter_appauth/lib/src/flutter_appauth.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ class FlutterAppAuth {
const FlutterAppAuth();

/// Convenience method for authorizing and then exchanges code
Future<AuthorizationTokenResponse?> authorizeAndExchangeCode(
AuthorizationTokenRequest request) {
Future<AuthorizationTokenResponse?> authorizeAndExchangeCode(AuthorizationTokenRequest request) {
return FlutterAppAuthPlatform.instance.authorizeAndExchangeCode(request);
}

Expand All @@ -22,4 +21,8 @@ class FlutterAppAuth {
Future<EndSessionResponse?> endSession(EndSessionRequest request) {
return FlutterAppAuthPlatform.instance.endSession(request);
}

Future<void> processCallback(String url) {
return FlutterAppAuthPlatform.instance.processCallback(url);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,8 @@ abstract class FlutterAppAuthPlatform extends PlatformInterface {
}

/// Convenience method for authorizing and then exchanges the authorization grant code.
Future<AuthorizationTokenResponse?> authorizeAndExchangeCode(
AuthorizationTokenRequest request) {
throw UnimplementedError(
'authorizeAndExchangeCode() has not been implemented');
Future<AuthorizationTokenResponse?> authorizeAndExchangeCode(AuthorizationTokenRequest request) {
throw UnimplementedError('authorizeAndExchangeCode() has not been implemented');
}

/// Sends an authorization request.
Expand All @@ -50,4 +48,8 @@ abstract class FlutterAppAuthPlatform extends PlatformInterface {
Future<EndSessionResponse?> endSession(EndSessionRequest request) {
throw UnimplementedError('endSession() has not been implemented');
}

Future<void> processCallback(String url) {
throw UnimplementedError('processCallback() has not been implemented');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,26 @@ import 'method_channel_mappers.dart';
import 'token_request.dart';
import 'token_response.dart';

const MethodChannel _channel =
MethodChannel('crossingthestreams.io/flutter_appauth');
const MethodChannel _channel = MethodChannel('crossingthestreams.io/flutter_appauth');

class MethodChannelFlutterAppAuth extends FlutterAppAuthPlatform {
@override
Future<AuthorizationResponse?> authorize(AuthorizationRequest request) async {
final Map<dynamic, dynamic>? result =
await _channel.invokeMethod('authorize', request.toMap());
final Map<dynamic, dynamic>? result = await _channel.invokeMethod('authorize', request.toMap());
if (result == null) {
return null;
}
return AuthorizationResponse(
authorizationCode: result['authorizationCode'],
codeVerifier: result['codeVerifier'],
nonce: result['nonce'],
authorizationAdditionalParameters:
result['authorizationAdditionalParameters']?.cast<String, dynamic>(),
authorizationAdditionalParameters: result['authorizationAdditionalParameters']?.cast<String, dynamic>(),
);
}

@override
Future<AuthorizationTokenResponse?> authorizeAndExchangeCode(
AuthorizationTokenRequest request) async {
final Map<dynamic, dynamic>? result = await _channel.invokeMethod(
'authorizeAndExchangeCode', request.toMap());
Future<AuthorizationTokenResponse?> authorizeAndExchangeCode(AuthorizationTokenRequest request) async {
final Map<dynamic, dynamic>? result = await _channel.invokeMethod('authorizeAndExchangeCode', request.toMap());
if (result == null) {
return null;
}
Expand All @@ -44,8 +39,7 @@ class MethodChannelFlutterAppAuth extends FlutterAppAuthPlatform {
result['refreshToken'],
result['accessTokenExpirationTime'] == null
? null
: DateTime.fromMillisecondsSinceEpoch(
result['accessTokenExpirationTime'].toInt()),
: DateTime.fromMillisecondsSinceEpoch(result['accessTokenExpirationTime'].toInt()),
result['idToken'],
result['tokenType'],
result['scopes']?.cast<String>(),
Expand All @@ -55,8 +49,7 @@ class MethodChannelFlutterAppAuth extends FlutterAppAuthPlatform {

@override
Future<TokenResponse?> token(TokenRequest request) async {
final Map<dynamic, dynamic>? result =
await _channel.invokeMethod('token', request.toMap());
final Map<dynamic, dynamic>? result = await _channel.invokeMethod('token', request.toMap());
if (result == null) {
return null;
}
Expand All @@ -65,8 +58,7 @@ class MethodChannelFlutterAppAuth extends FlutterAppAuthPlatform {
result['refreshToken'],
result['accessTokenExpirationTime'] == null
? null
: DateTime.fromMillisecondsSinceEpoch(
result['accessTokenExpirationTime'].toInt()),
: DateTime.fromMillisecondsSinceEpoch(result['accessTokenExpirationTime'].toInt()),
result['idToken'],
result['tokenType'],
result['scopes']?.cast<String>(),
Expand All @@ -75,11 +67,15 @@ class MethodChannelFlutterAppAuth extends FlutterAppAuthPlatform {

@override
Future<EndSessionResponse?> endSession(EndSessionRequest request) async {
final Map<dynamic, dynamic>? result =
await _channel.invokeMethod('endSession', request.toMap());
final Map<dynamic, dynamic>? result = await _channel.invokeMethod('endSession', request.toMap());
if (result == null) {
return null;
}
return EndSessionResponse(result['state']);
}

@override
Future<void> processCallback(String url) async {
await _channel.invokeMethod('processCallback', {"url": url});
}
}