Skip to content

Commit 1bfcb8e

Browse files
committed
Fixed pending auth for iOS
1 parent 22e049e commit 1bfcb8e

File tree

4 files changed

+37
-28
lines changed

4 files changed

+37
-28
lines changed

ios/OAuthManager/OAuthClient.m

+3-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ - (void) savePendingAccount:(DCTAuthAccount *) account
4343

4444
- (void) clearPendingAccount
4545
{
46-
_account = nil;
46+
NSLog(@"called clearPendingAccount: %@", _account);
47+
[_account cancelAuthentication];
48+
_account = nil;
4749
}
4850

4951
- (void (^)(DCTAuthResponse *response, NSError *error)) getHandler:(DCTAuthAccount *) account

ios/OAuthManager/OAuthManager.m

+32-25
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,29 @@ @implementation OAuthManager
2525
@synthesize callbackUrls = _callbackUrls;
2626

2727
static NSString *const AUTH_MANAGER_TAG = @"AUTH_MANAGER";
28+
static OAuthManager *manager;
29+
static dispatch_once_t onceToken;
2830

2931
RCT_EXPORT_MODULE(OAuthManager);
3032

33+
// Run on a different thread
34+
- (dispatch_queue_t)methodQueue
35+
{
36+
return dispatch_queue_create("io.fullstack.oauth", DISPATCH_QUEUE_SERIAL);
37+
}
38+
3139
+ (instancetype)sharedManager {
32-
static OAuthManager *manager;
33-
static dispatch_once_t onceToken;
3440
dispatch_once(&onceToken, ^{
3541
manager = [self new];
3642
});
3743
return manager;
3844
}
3945

46+
+ (void) reset {
47+
onceToken = nil;
48+
manager = nil;
49+
}
50+
4051
- (instancetype) init {
4152
self = [super init];
4253
if (self != nil) {
@@ -59,10 +70,7 @@ - (void) dealloc
5970

6071
- (void) didBecomeActive:(NSNotification *)notification
6172
{
62-
NSLog(@"Application reopened: %@", @(self.pendingAuthentication));
63-
for (OAuthClient *client in _pendingClients) {
64-
[self removePending:client];
65-
}
73+
// TODO?
6674
}
6775

6876
/*
@@ -74,7 +82,7 @@ + (BOOL)setupOAuthHandler:(UIApplication *)application
7482
DCTAuthPlatform *authPlatform = [DCTAuthPlatform sharedPlatform];
7583

7684
[authPlatform setURLOpener: ^void(NSURL *URL, DCTAuthPlatformCompletion completion) {
77-
[sharedManager setPendingAuthentication:YES];
85+
// [sharedManager setPendingAuthentication:YES];
7886
[application openURL:URL];
7987
completion(YES);
8088
}];
@@ -101,13 +109,10 @@ + (BOOL)handleOpenUrl:(UIApplication *)application openURL:(NSURL *)url
101109
OAuthManager *manager = [OAuthManager sharedManager];
102110
NSString *strUrl = [manager stringHost:url];
103111

104-
NSLog(@"Handling handleOpenUrl: %@", strUrl);
105-
106112
if ([manager.callbackUrls indexOfObject:strUrl] != NSNotFound) {
107113
return [DCTAuth handleURL:url];
108114
}
109115

110-
111116
[manager clearPending];
112117

113118
return [RCTLinkingManager application:application openURL:url
@@ -191,14 +196,14 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name
191196
callback:(RCTResponseSenderBlock) callback)
192197
{
193198
OAuthManager *manager = [OAuthManager sharedManager];
194-
DCTAuthAccountStore *store = [self accountStore];
199+
DCTAuthAccountStore *store = [manager accountStore];
195200

196201
NSSet *accounts = [store accounts];
197202
NSMutableArray *respAccounts = [[NSMutableArray alloc] init];
198203
for (DCTAuthAccount *account in [accounts allObjects]) {
199204
NSString *providerName = account.type;
200205
NSMutableDictionary *cfg = [[manager getConfigForProvider:providerName] mutableCopy];
201-
NSMutableDictionary *acc = [[self getAccountResponse:account cfg:cfg] mutableCopy];
206+
NSMutableDictionary *acc = [[manager getAccountResponse:account cfg:cfg] mutableCopy];
202207
[acc setValue:providerName forKey:@"provider"];
203208
[respAccounts addObject:acc];
204209
}
@@ -215,17 +220,18 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name
215220
OAuthManager *manager = [OAuthManager sharedManager];
216221
NSMutableDictionary *cfg = [[manager getConfigForProvider:providerName] mutableCopy];
217222

218-
DCTAuthAccount *existingAccount = [self accountForProvider:providerName];
223+
DCTAuthAccount *existingAccount = [manager accountForProvider:providerName];
219224
if (existingAccount != nil) {
220225
if ([existingAccount isAuthorized]) {
221226
NSDictionary *accountResponse = [manager getAccountResponse:existingAccount cfg:cfg];
222227
callback(@[[NSNull null], @{
223228
@"status": @"ok",
229+
@"provider": providerName,
224230
@"response": accountResponse
225231
}]);
226232
return;
227233
} else {
228-
DCTAuthAccountStore *store = [self accountStore];
234+
DCTAuthAccountStore *store = [manager accountStore];
229235
[store deleteAccount:existingAccount];
230236
NSDictionary *errResp = @{
231237
@"status": @"error",
@@ -250,9 +256,9 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name
250256
callback:(RCTResponseSenderBlock) callback)
251257
{
252258
OAuthManager *manager = [OAuthManager sharedManager];
253-
DCTAuthAccountStore *store = [self accountStore];
259+
DCTAuthAccountStore *store = [manager accountStore];
254260

255-
DCTAuthAccount *existingAccount = [self accountForProvider:providerName];
261+
DCTAuthAccount *existingAccount = [manager accountForProvider:providerName];
256262
if (existingAccount != nil) {
257263
[store deleteAccount:existingAccount];
258264
callback(@[[NSNull null], @{
@@ -276,19 +282,21 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name
276282
callback:(RCTResponseSenderBlock)callback)
277283
{
278284
OAuthManager *manager = [OAuthManager sharedManager];
285+
[manager clearPending];
279286
NSMutableDictionary *cfg = [[manager getConfigForProvider:providerName] mutableCopy];
280287

281-
DCTAuthAccount *existingAccount = [self accountForProvider:providerName];
288+
DCTAuthAccount *existingAccount = [manager accountForProvider:providerName];
282289
if (existingAccount != nil) {
283290
if ([existingAccount isAuthorized]) {
284291
NSDictionary *accountResponse = [manager getAccountResponse:existingAccount cfg:cfg];
285292
callback(@[[NSNull null], @{
286293
@"status": @"ok",
294+
@"provider": providerName,
287295
@"response": accountResponse
288296
}]);
289297
return;
290298
} else {
291-
DCTAuthAccountStore *store = [self accountStore];
299+
DCTAuthAccountStore *store = [manager accountStore];
292300
[store deleteAccount:existingAccount];
293301
}
294302
}
@@ -317,7 +325,6 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name
317325
} else if ([version isEqualToString:@"2.0"]) {
318326
client = (OAuthClient *)[[OAuth2Client alloc] init];
319327
} else {
320-
NSLog(@"Provider number: %@", version);
321328
return callback(@[@{
322329
@"status": @"error",
323330
@"msg": @"Unknown provider"
@@ -326,20 +333,19 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name
326333

327334
// Store pending client
328335

329-
[self addPending:client];
336+
[manager addPending:client];
330337
_pendingAuthentication = YES;
331338

332339
[client authorizeWithUrl:providerName
333340
url:callbackUrl
334341
cfg:cfg
335342

336343
onSuccess:^(DCTAuthAccount *account) {
337-
NSLog(@"authorizeWithUrl: %@", account);
338344
NSDictionary *accountResponse = [manager getAccountResponse:account cfg:cfg];
339345
_pendingAuthentication = NO;
340346
[manager removePending:client];
341347

342-
DCTAuthAccountStore *store = [self accountStore];
348+
DCTAuthAccountStore *store = [manager accountStore];
343349
[store saveAccount:account];
344350

345351
callback(@[[NSNull null], @{
@@ -365,7 +371,7 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name
365371
OAuthManager *manager = [OAuthManager sharedManager];
366372
NSMutableDictionary *cfg = [[manager getConfigForProvider:providerName] mutableCopy];
367373

368-
DCTAuthAccount *existingAccount = [self accountForProvider:providerName];
374+
DCTAuthAccount *existingAccount = [manager accountForProvider:providerName];
369375
if (existingAccount == nil) {
370376
NSDictionary *errResp = @{
371377
@"status": @"error",
@@ -397,7 +403,7 @@ - (NSDictionary *) getConfigForProvider:(NSString *)name
397403

398404
NSString *methodStr = [opts valueForKey:@"method"];
399405

400-
DCTAuthRequestMethod method = [self getRequestMethodByString:methodStr];
406+
DCTAuthRequestMethod method = [manager getRequestMethodByString:methodStr];
401407

402408
DCTAuthRequest *request =
403409
[[DCTAuthRequest alloc]
@@ -531,6 +537,7 @@ - (void) clearPending
531537
[manager removePending:client];
532538
}
533539
manager.pendingClients = [NSArray array];
540+
_pendingAuthentication = NO;
534541
}
535542

536543
- (void) addPending:(OAuthClient *) client
@@ -543,12 +550,12 @@ - (void) addPending:(OAuthClient *) client
543550

544551
- (void) removePending:(OAuthClient *) client
545552
{
553+
[client clearPendingAccount];
546554
OAuthManager *manager = [OAuthManager sharedManager];
547555
NSUInteger idx = [manager.pendingClients indexOfObject:client];
548556
if ([manager.pendingClients count] <= idx) {
549557
NSMutableArray *newPendingClients = [manager.pendingClients mutableCopy];
550558
[newPendingClients removeObjectAtIndex:idx];
551-
[client cancelAuthentication];
552559
manager.pendingClients = newPendingClients;
553560
}
554561
}

lib/authProviders.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export const authProviders = {
4949
auth_version: "2.0",
5050
authorize_url: 'https://accounts.google.com/o/oauth2/auth',
5151
access_token_url: 'https://accounts.google.com/o/oauth2/token',
52-
callback_url: ({app_name}) => `${app_name}:/oauth-response`,
52+
callback_url: ({app_name}) => `${app_name}://oauth-response`,
5353
validate: validate()
5454
}
5555
}

react-native-oauth.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ export default class OAuthManager {
120120
.reduce((sum, key) => ({
121121
...sum,
122122
[key]: typeof config[key] === 'function' ? config[key](config) : config[key]
123-
}), {})
123+
}), {});
124124

125125
validate(config);
126126
return promisify('configureProvider')(name, config);

0 commit comments

Comments
 (0)