Skip to content

Commit 0bc08eb

Browse files
authored
Merge pull request #1478 from OneSignal/identity_verification_callback
Fire jwt invalidated callback when receiving 401 errors
2 parents c9b0a94 + d4588f5 commit 0bc08eb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+2651
-507
lines changed

iOS_SDK/OneSignalDevApp/OneSignalDevApp/AppDelegate.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
#import <UIKit/UIKit.h>
3232
#import <OneSignalFramework/OneSignalFramework.h>
3333

34-
@interface AppDelegate : UIResponder <UIApplicationDelegate, OSNotificationPermissionObserver, OSInAppMessageLifecycleListener, OSPushSubscriptionObserver, OSNotificationLifecycleListener, OSInAppMessageClickListener, OSNotificationClickListener, OSUserStateObserver>
34+
@interface AppDelegate : UIResponder <UIApplicationDelegate, OSNotificationPermissionObserver, OSInAppMessageLifecycleListener, OSPushSubscriptionObserver, OSNotificationLifecycleListener, OSInAppMessageClickListener, OSNotificationClickListener, OSUserStateObserver, OSUserJwtInvalidatedListener>
3535

3636
@property (strong, nonatomic) UIWindow *window;
3737

iOS_SDK/OneSignalDevApp/OneSignalDevApp/AppDelegate.m

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ @implementation AppDelegate
4646

4747
OneSignalNotificationCenterDelegate *_notificationDelegate;
4848

49+
// ECM Should we ship these typedefs in OneSignalFramework.h to make them available to Objective C customers?
50+
typedef void (^JwtCompletionBlock)(NSString*);
51+
typedef void (^JwtExpiredBlock)(NSString *, JwtCompletionBlock);
52+
4953
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
5054

5155
// [FIRApp configure];
@@ -72,6 +76,7 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
7276
[OneSignal.User addObserver:self];
7377
[OneSignal.Notifications addPermissionObserver:self];
7478
[OneSignal.InAppMessages addClickListener:self];
79+
[OneSignal addUserJwtInvalidatedListener:self];
7580

7681
NSLog(@"UNUserNotificationCenter.delegate: %@", UNUserNotificationCenter.currentNotificationCenter.delegate);
7782

@@ -86,8 +91,8 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
8691
return YES;
8792
}
8893

89-
#define ONESIGNAL_APP_ID_DEFAULT @"STAGING_APP_HERE"
90-
#define ONESIGNAL_APP_ID_KEY_FOR_TESTING @"YOUR_APP_ID_HERE"
94+
#define ONESIGNAL_APP_ID_DEFAULT @"77e32082-ea27-42e3-a898-c72e141824ef"
95+
#define ONESIGNAL_APP_ID_KEY_FOR_TESTING @"77e32082-ea27-42e3-a898-c72e141824ef"
9196

9297
+ (NSString*)getOneSignalAppId {
9398
NSString* userDefinedAppId = [[NSUserDefaults standardUserDefaults] objectForKey:ONESIGNAL_APP_ID_KEY_FOR_TESTING];
@@ -121,6 +126,10 @@ - (void)onUserStateDidChangeWithState:(OSUserChangedState * _Nonnull)state {
121126
NSLog(@"Dev App onUserStateDidChangeWithState: %@", [state jsonRepresentation]);
122127
}
123128

129+
- (void)onUserJwtInvalidatedWithEvent:(OSUserJwtInvalidatedEvent * _Nonnull)event {
130+
NSLog(@"Dev App onUserJwtInvalidatedWithEvent: %@", [event jsonRepresentation]);
131+
}
132+
124133
#pragma mark OSInAppMessageDelegate
125134

126135
- (void)onClickInAppMessage:(OSInAppMessageClickEvent * _Nonnull)event {

iOS_SDK/OneSignalDevApp/OneSignalDevApp/SwiftTest.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,19 @@
2828
import Foundation
2929
import OneSignalFramework
3030

31-
class SwiftTest: NSObject {
31+
class SwiftTest: NSObject, OSUserJwtInvalidatedListener {
32+
func onUserJwtInvalidated(event: OSUserJwtInvalidatedEvent) {
33+
print("event: \(event.jsonRepresentation())")
34+
print("externalId: \(event.externalId)")
35+
}
36+
3237
func testSwiftUserModel() {
3338
let token1 = OneSignal.User.pushSubscription.token
3439
let token = OneSignal.User.pushSubscription.token
3540
OneSignal.Debug._dump()
41+
OneSignal.login(externalId: "euid", token: "token")
42+
OneSignal.updateUserJwt(externalId: "euid", token: "token")
43+
OneSignal.addUserJwtInvalidatedListener(self)
44+
OneSignal.removeUserJwtInvalidatedListener(self)
3645
}
3746
}

iOS_SDK/OneSignalDevApp/OneSignalDevApp/ViewController.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,14 +197,14 @@ - (IBAction)inAppMessagingSegmentedControlValueChanged:(UISegmentedControl *)sen
197197
- (IBAction)loginExternalUserId:(UIButton *)sender {
198198
NSString* externalUserId = self.externalUserIdTextField.text;
199199
NSString* token = self.tokenTextField.text;
200-
NSLog(@"Dev App: Logging in to external user ID %@ and token %@", externalUserId, token);
200+
NSLog(@"Dev App: Logging in to external user ID %@ and token %@", externalUserId, token);
201201
[OneSignal login:externalUserId withToken:token];
202202
}
203203

204204
- (IBAction)updateJwt:(id)sender {
205205
NSString* externalUserId = self.externalUserIdTextField.text;
206206
NSString* token = self.tokenTextField.text;
207-
NSLog(@"Dev App: updating JWT for external user ID %@ and token %@", externalUserId, token);
207+
NSLog(@"Dev App: updating JWT for external user ID %@ and token %@", externalUserId, token);
208208
[OneSignal updateUserJwt:externalUserId withToken:token];
209209
}
210210

iOS_SDK/OneSignalDevApp/OneSignalExample.xcodeproj/project.pbxproj

Lines changed: 221 additions & 6 deletions
Large diffs are not rendered by default.

iOS_SDK/OneSignalSDK/OneSignal.xcodeproj/project.pbxproj

Lines changed: 60 additions & 8 deletions
Large diffs are not rendered by default.

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@
3333
// Networking
3434
#define OS_API_VERSION @"1"
3535
#define OS_API_ACCEPT_HEADER @"application/vnd.onesignal.v" OS_API_VERSION @"+json"
36-
#define OS_API_SERVER_URL @"https://api.staging.onesignal.com/"
37-
#define OS_IAM_WEBVIEW_BASE_URL @"https://staging.onesignal.com/"
36+
#define OS_API_SERVER_URL @"https://api.onesignal.com/"
37+
#define OS_IAM_WEBVIEW_BASE_URL @"https://onesignal.com/"
3838

3939
// OneSignalUserDefault keys
4040
// String values start with "OSUD_" to maintain a level of uniqueness from other libs and app code
@@ -79,7 +79,6 @@
7979
#define OSUD_REQUIRES_USER_PRIVACY_CONSENT @"OSUD_REQUIRES_USER_PRIVACY_CONSENT"
8080

8181
/* Identity Verification */
82-
// TODO: JWT 🔐 Figure out the key below and may need to relate to existing key IOS_REQUIRES_USER_ID_AUTHENTICATION
8382
#define OSUD_USE_IDENTITY_VERIFICATION @"OSUD_USE_IDENTITY_VERIFICATION"
8483
#define OS_JWT_BEARER_TOKEN @"OS_JWT_BEARER_TOKEN"
8584
#define OS_JWT_TOKEN_INVALID @"OS_JWT_TOKEN_INVALID"
@@ -135,7 +134,7 @@
135134
#define IOS_USES_PROVISIONAL_AUTHORIZATION @"uses_provisional_auth"
136135
#define IOS_REQUIRES_EMAIL_AUTHENTICATION @"require_email_auth"
137136
#define IOS_REQUIRES_SMS_AUTHENTICATION @"require_sms_auth"
138-
#define IOS_REQUIRES_USER_ID_AUTHENTICATION @"require_user_id_auth" // TODO: JWT 🔐 Figure out the key, also think about needing to migrate this value
137+
#define IOS_JWT_REQUIRED @"jwt_required" // Returned by remote params
139138
#define IOS_RECEIVE_RECEIPTS_ENABLE @"receive_receipts_enable"
140139
#define IOS_OUTCOMES_V2_SERVICE_ENABLE @"v2_enabled"
141140
#define IOS_LOCATION_SHARED @"location_shared"
@@ -347,23 +346,28 @@ typedef enum {GET, POST, HEAD, PUT, DELETE, OPTIONS, CONNECT, TRACE, PATCH} HTTP
347346
#define OS_USER_EXECUTOR @"OS_USER_EXECUTOR"
348347
#define OS_USER_EXECUTOR_USER_REQUEST_QUEUE_KEY @"OS_USER_EXECUTOR_USER_REQUEST_QUEUE_KEY"
349348
#define OS_USER_EXECUTOR_TRANSFER_SUBSCRIPTION_REQUEST_QUEUE_KEY @"OS_USER_EXECUTOR_TRANSFER_SUBSCRIPTION_REQUEST_QUEUE_KEY"
349+
#define OS_USER_EXECUTOR_PENDING_QUEUE_KEY @"OS_USER_EXECUTOR_PENDING_QUEUE_KEY"
350350

351351
// Identity Executor
352352
#define OS_IDENTITY_EXECUTOR @"OS_IDENTITY_EXECUTOR"
353353
#define OS_IDENTITY_EXECUTOR_DELTA_QUEUE_KEY @"OS_IDENTITY_EXECUTOR_DELTA_QUEUE_KEY"
354354
#define OS_IDENTITY_EXECUTOR_ADD_REQUEST_QUEUE_KEY @"OS_IDENTITY_EXECUTOR_ADD_REQUEST_QUEUE_KEY"
355355
#define OS_IDENTITY_EXECUTOR_REMOVE_REQUEST_QUEUE_KEY @"OS_IDENTITY_EXECUTOR_REMOVE_REQUEST_QUEUE_KEY"
356+
#define OS_IDENTITY_EXECUTOR_PENDING_QUEUE_KEY @"OS_IDENTITY_EXECUTOR_PENDING_QUEUE_KEY"
356357

357358
// Property Executor
358359
#define OS_PROPERTIES_EXECUTOR @"OS_PROPERTIES_EXECUTOR"
359360
#define OS_PROPERTIES_EXECUTOR_DELTA_QUEUE_KEY @"OS_PROPERTIES_EXECUTOR_DELTA_QUEUE_KEY"
360361
#define OS_PROPERTIES_EXECUTOR_UPDATE_REQUEST_QUEUE_KEY @"OS_PROPERTIES_EXECUTOR_UPDATE_REQUEST_QUEUE_KEY"
362+
#define OS_PROPERTIES_EXECUTOR_PENDING_QUEUE_KEY @"OS_PROPERTIES_EXECUTOR_PENDING_QUEUE_KEY"
361363

362364
// Subscription Executor
365+
#define OS_SUBSCRIPTION_EXECUTOR @"OS_SUBSCRIPTION_EXECUTOR"
363366
#define OS_SUBSCRIPTION_EXECUTOR_DELTA_QUEUE_KEY @"OS_SUBSCRIPTION_EXECUTOR_DELTA_QUEUE_KEY"
364367
#define OS_SUBSCRIPTION_EXECUTOR_ADD_REQUEST_QUEUE_KEY @"OS_SUBSCRIPTION_EXECUTOR_ADD_REQUEST_QUEUE_KEY"
365368
#define OS_SUBSCRIPTION_EXECUTOR_REMOVE_REQUEST_QUEUE_KEY @"OS_SUBSCRIPTION_EXECUTOR_REMOVE_REQUEST_QUEUE_KEY"
366369
#define OS_SUBSCRIPTION_EXECUTOR_UPDATE_REQUEST_QUEUE_KEY @"OS_SUBSCRIPTION_EXECUTOR_UPDATE_REQUEST_QUEUE_KEY"
370+
#define OS_SUBSCRIPTION_EXECUTOR_PENDING_QUEUE_KEY @"OS_SUBSCRIPTION_EXECUTOR_PENDING_QUEUE_KEY"
367371

368372
// Live Activies Executor
369373
#define OS_LIVE_ACTIVITIES_EXECUTOR_UPDATE_TOKENS_KEY @"OS_LIVE_ACTIVITIES_EXECUTOR_UPDATE_TOKENS_KEY"

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalMobileProvision.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ + (OSUIApplicationReleaseMode) releaseMode {
8787
NSDictionary *entitlements = nil;
8888
NSDictionary *provision = [self getProvision];
8989
if (provision) {
90-
// [OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"provision: %@", provision]];
90+
[OneSignalLog onesignalLog:ONE_S_LL_DEBUG message:[NSString stringWithFormat:@"provision: %@", provision]];
9191
entitlements = [provision objectForKey:@"Entitlements"];
9292
}
9393
else

iOS_SDK/OneSignalSDK/OneSignalInAppMessages/Controller/OSMessagingController.m

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,10 @@ - (void)initializeTriggerController {
250250

251251
- (void)updateInAppMessagesFromCache {
252252
self.messages = [OneSignalUserDefaults.initStandard getSavedCodeableDataForKey:OS_IAM_MESSAGES_ARRAY defaultValue:[NSArray new]];
253-
[self evaluateMessages];
253+
// ECM THIS NEEDS TO RUN ON THE MAIN THREAD
254+
dispatch_async(dispatch_get_main_queue(), ^{
255+
[self evaluateMessages];
256+
});
254257
}
255258

256259
/**
@@ -323,11 +326,16 @@ - (void)getInAppMessagesFromServer {
323326
OSResponseStatusType responseType = [OSNetworkingUtils getResponseStatusType:error.code];
324327
if (responseType == OSResponseStatusUnauthorized) {
325328
shouldRetryGetInAppMessagesOnJwtUpdated = true;
329+
[self handleUnauthroizedError:error externalId:alias.id];
326330
}
327331
[self updateInAppMessagesFromCache];
328332
}];
329333
}
330334

335+
- (void)handleUnauthroizedError:(NSError*)error externalId:(NSString *)externalId {
336+
[OneSignalUserManagerImpl.sharedInstance invalidateJwtForExternalIdWithExternalId:externalId error:error];
337+
}
338+
331339
- (void)updateInAppMessagesFromServer:(NSArray<OSInAppMessageInternal *> *)newMessages {
332340
[OneSignalLog onesignalLog:ONE_S_LL_VERBOSE message:@"updateInAppMessagesFromServer"];
333341
self.messages = newMessages;
@@ -1146,7 +1154,6 @@ - (void)onPushSubscriptionDidChangeWithState:(OSPushSubscriptionChangedState * _
11461154

11471155
#pragma mark OSUserStateObserver Methods
11481156
- (void)onUserStateDidChangeWithState:(OSUserChangedState * _Nonnull)state {
1149-
NSLog(@"❌ OSMessagingController onUserStateDidChangeWithState: %@", [state jsonRepresentation]);
11501157
if (state.current.onesignalId && shouldRetryGetInAppMessagesOnUserChange) {
11511158
shouldRetryGetInAppMessagesOnUserChange = false;
11521159
[self getInAppMessagesFromServer];
@@ -1159,7 +1166,6 @@ - (void)onRequiresUserAuthChangedFrom:(enum OSRequiresUserAuth)from to:(enum OSR
11591166
}
11601167

11611168
- (void)onJwtUpdatedWithExternalId:(NSString *)externalId token:(NSString *)token {
1162-
NSLog(@"❌ OSMessagingController onJwtUpdatedWithExternalId: %@ token: %@", externalId, token);
11631169
if (![token isEqual: OS_JWT_TOKEN_INVALID] && shouldRetryGetInAppMessagesOnJwtUpdated) {
11641170
shouldRetryGetInAppMessagesOnJwtUpdated = false;
11651171
[self getInAppMessagesFromServer];

iOS_SDK/OneSignalSDK/OneSignalOSCore/Source/Jwt/OSUserJwtConfig.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,7 @@ public class OSUserJwtConfig {
6464
return
6565
}
6666

67-
print("❌ OSUserJwtConfig.requiresUserAuth: changing from \(oldValue) to \(requiresUserAuth), firing \(changeNotifier)")
68-
67+
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSUserJwtConfig.requiresUserAuth: changing from \(oldValue) to \(requiresUserAuth), firing listeners")
6968
// Persist new value
7069
OneSignalUserDefaults.initShared().saveInteger(forKey: OSUD_USE_IDENTITY_VERIFICATION, withValue: requiresUserAuth.rawValue)
7170

@@ -93,9 +92,6 @@ public class OSUserJwtConfig {
9392

9493
public init() {
9594
let rawValue = OneSignalUserDefaults.initShared().getSavedInteger(forKey: OSUD_USE_IDENTITY_VERIFICATION, defaultValue: OSRequiresUserAuth.unknown.rawValue)
96-
97-
print("❌ OSUserJwtConfig init(): \(String(describing: OSRequiresUserAuth(rawValue: rawValue))))")
98-
9995
requiresUserAuth = OSRequiresUserAuth(rawValue: rawValue) ?? OSRequiresUserAuth.unknown
10096
}
10197

@@ -104,7 +100,7 @@ public class OSUserJwtConfig {
104100
}
105101

106102
public func onJwtTokenChanged(externalId: String, token: String?) {
107-
print("OSUserJwtConfig.onJwtTokenChanged \(externalId): \(token)")
103+
OneSignalLog.onesignalLog(.LL_VERBOSE, message: "OSUserJwtConfig.onJwtTokenChanged for \(externalId) with token \(token ?? "nil"), firing listeners")
108104
changeNotifier.fire { listener in
109105
listener.onJwtUpdated(externalId: externalId, token: token)
110106
}

0 commit comments

Comments
 (0)